Don't switch projects when viewing the "Account Settings" page

This commit is contained in:
Pēteris Caune 2019-01-22 16:23:51 +02:00
parent b12eb1ee75
commit eaf49f2367
No known key found for this signature in database
GPG Key ID: E28D7679E9A9EDE2
10 changed files with 21 additions and 61 deletions

View File

@ -1,5 +1,4 @@
from django.db.models import Q from hc.accounts.models import Profile
from hc.accounts.models import Profile, Project
class TeamAccessMiddleware(object): class TeamAccessMiddleware(object):
@ -10,12 +9,6 @@ class TeamAccessMiddleware(object):
if not request.user.is_authenticated: if not request.user.is_authenticated:
return self.get_response(request) return self.get_response(request)
is_owner = Q(owner=request.user)
is_member = Q(member__user_id=request.user.id)
projects_q = Project.objects.filter(is_owner | is_member).distinct()
projects_q = projects_q.select_related("owner")
request.get_projects = lambda: list(projects_q)
profile = Profile.objects.for_user(request.user) profile = Profile.objects.for_user(request.user)
if profile.current_project is None: if profile.current_project is None:
profile.current_project = profile.get_own_project() profile.current_project = profile.get_own_project()

View File

@ -110,13 +110,17 @@ class Profile(models.Model):
} }
emails.change_email(self.user.email, ctx) emails.change_email(self.user.email, ctx)
def checks_from_all_projects(self): def projects(self):
""" Return a queryset of checks from projects we have access to. """ """ Return a queryset of all projects we have access to. """
is_owner = models.Q(owner=self.user) is_owner = models.Q(owner=self.user)
is_member = models.Q(member__user=self.user) is_member = models.Q(member__user=self.user)
q = Project.objects.filter(is_owner | is_member) return Project.objects.filter(is_owner | is_member)
project_ids = q.values("id")
def checks_from_all_projects(self):
""" Return a queryset of checks from projects we have access to. """
project_ids = self.projects().values("id")
from hc.api.models import Check from hc.api.models import Check
return Check.objects.filter(project_id__in=project_ids) return Check.objects.filter(project_id__in=project_ids)

View File

@ -4,7 +4,6 @@ from django.core import mail
from django.conf import settings from django.conf import settings
from django.utils.timezone import now from django.utils.timezone import now
from hc.test import BaseTestCase from hc.test import BaseTestCase
from hc.accounts.models import Member
from hc.api.models import Check from hc.api.models import Check
@ -93,16 +92,6 @@ class ProfileTestCase(BaseTestCase):
self.assertEqual(len(mail.outbox), 0) self.assertEqual(len(mail.outbox), 0)
def test_it_switches_to_own_team(self):
self.client.login(username="bob@example.org", password="password")
self.client.get("/accounts/profile/")
# After visiting the profile page, team should be switched back
# to user's default team.
self.bobs_profile.refresh_from_db()
self.assertEqual(self.bobs_profile.current_project, self.bobs_project)
def test_it_sends_change_email_link(self): def test_it_sends_change_email_link(self):
self.client.login(username="alice@example.org", password="password") self.client.login(username="alice@example.org", password="password")

View File

@ -74,16 +74,6 @@ def _make_user(email):
return user return user
def _ensure_own_team(request):
""" Make sure user is switched to their own team. """
if request.project.owner != request.user:
request.project = request.profile.get_own_project()
request.profile.current_project = request.project
request.profile.save()
def _redirect_after_login(request): def _redirect_after_login(request):
""" Redirect to the URL indicated in ?next= query parameter. """ """ Redirect to the URL indicated in ?next= query parameter. """
@ -188,14 +178,11 @@ def check_token(request, username, token):
@login_required @login_required
def profile(request): def profile(request):
_ensure_own_team(request)
profile = request.profile profile = request.profile
project = profile.get_own_project()
ctx = { ctx = {
"page": "profile", "page": "profile",
"profile": profile, "profile": profile,
"project": project
} }
if request.method == "POST": if request.method == "POST":
@ -212,12 +199,10 @@ def profile(request):
@login_required @login_required
def project(request, code): def project(request, code):
project = Project.objects.get(code=code, owner_id=request.user.id) project = Project.objects.get(code=code, owner_id=request.user.id)
profile = project.owner_profile
ctx = { ctx = {
"page": "profile", "page": "profile",
"project": project, "project": project,
"profile": profile,
"show_api_keys": False, "show_api_keys": False,
"project_name_status": "default", "project_name_status": "default",
"api_status": "default", "api_status": "default",
@ -292,7 +277,6 @@ def project(request, code):
@login_required @login_required
def notifications(request): def notifications(request):
_ensure_own_team(request)
profile = request.profile profile = request.profile
ctx = { ctx = {
@ -328,14 +312,8 @@ def notifications(request):
@login_required @login_required
def badges(request): def badges(request):
_ensure_own_team(request)
projects = [request.project]
for membership in request.user.memberships.all():
projects.append(membership.project)
badge_sets = [] badge_sets = []
for project in projects: for project in request.profile.projects():
tags = set() tags = set()
for check in Check.objects.filter(project=project): for check in Check.objects.filter(project=project):
tags.update(check.tags_list()) tags.update(check.tags_list())

View File

@ -85,9 +85,7 @@ def _has_access(request, project_code):
if request.user.is_superuser: if request.user.is_superuser:
return True return True
is_owner = Q(owner_id=request.user.id) projects = request.profile.projects()
is_member = Q(member__user_id=request.user.id)
projects = Project.objects.filter(is_owner | is_member)
return projects.filter(code=project_code).exists() return projects.filter(code=project_code).exists()

View File

@ -35,12 +35,6 @@ def pricing(request):
@login_required @login_required
def billing(request): def billing(request):
if request.project.owner != request.user:
request.project = request.profile.get_own_project()
request.profile.current_project = request.project
request.profile.save()
# Don't use Subscription.objects.for_user method here, so a # Don't use Subscription.objects.for_user method here, so a
# subscription object is not created just by viewing a page. # subscription object is not created just by viewing a page.
sub = Subscription.objects.filter(user_id=request.user.id).first() sub = Subscription.objects.filter(user_id=request.user.id).first()

View File

@ -6,7 +6,7 @@
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
<h1 class="settings-title">Settings</h1> <h1 class="settings-title">Settings <small>{{ request.user.email }}</small></h1>
</div> </div>
</div> </div>

View File

@ -6,7 +6,10 @@
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
<h1 class="settings-title">Settings</h1> <h1 class="settings-title">
Settings
<small>{{ request.user.email}}</small>
</h1>
</div> </div>
</div> </div>

View File

@ -6,7 +6,10 @@
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
<h1 class="settings-title">Settings</h1> <h1 class="settings-title">
Settings
<small>{{ request.user.email }}</small>
</h1>
</div> </div>
</div> </div>

View File

@ -123,8 +123,7 @@
<span class="caret"></span> <span class="caret"></span>
</a> </a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
{% with projects=request.get_projects %} {% for project in request.profile.projects.all %}
{% for project in projects %}
<li class="dropdown-header">{{ project }}</li> <li class="dropdown-header">{{ project }}</li>
<li> <li>
<a href="{% url 'hc-switch-project' project.code %}">Checks</a> <a href="{% url 'hc-switch-project' project.code %}">Checks</a>
@ -136,7 +135,6 @@
{% endif %} {% endif %}
<li role="separator" class="divider"></li> <li role="separator" class="divider"></li>
{% endfor %} {% endfor %}
{% endwith %}
<li><a href="{% url 'hc-profile' %}">Account Settings</a></li> <li><a href="{% url 'hc-profile' %}">Account Settings</a></li>
<li><a href="{% url 'hc-logout' %}">Log Out</a></li> <li><a href="{% url 'hc-logout' %}">Log Out</a></li>