forked from GithubBackups/healthchecks
Don't switch projects when viewing the "Account Settings" page
This commit is contained in:
parent
b12eb1ee75
commit
eaf49f2367
@ -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()
|
||||||
|
@ -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)
|
||||||
|
@ -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")
|
||||||
|
|
||||||
|
@ -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())
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user