forked from GithubBackups/healthchecks
Remove Profile.team_name (use Project.name instead) and Profile.current_team (use Profile.current_project instead)
This commit is contained in:
parent
77e3212956
commit
664aad916a
@ -19,15 +19,15 @@ class Fieldset:
|
|||||||
|
|
||||||
class ProfileFieldset(Fieldset):
|
class ProfileFieldset(Fieldset):
|
||||||
name = "User Profile"
|
name = "User Profile"
|
||||||
fields = ("email", "current_team", "reports_allowed",
|
fields = ("email", "current_project", "reports_allowed",
|
||||||
"next_report_date", "nag_period", "next_nag_date",
|
"next_report_date", "nag_period", "next_nag_date",
|
||||||
"token", "sort")
|
"token", "sort")
|
||||||
|
|
||||||
|
|
||||||
class TeamFieldset(Fieldset):
|
class TeamFieldset(Fieldset):
|
||||||
name = "Team"
|
name = "Team"
|
||||||
fields = ("team_name", "team_limit", "check_limit",
|
fields = ("team_limit", "check_limit", "ping_log_limit", "sms_limit",
|
||||||
"ping_log_limit", "sms_limit", "sms_sent", "last_sms_date")
|
"sms_sent", "last_sms_date")
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Profile)
|
@admin.register(Profile)
|
||||||
@ -39,7 +39,7 @@ class ProfileAdmin(admin.ModelAdmin):
|
|||||||
}
|
}
|
||||||
|
|
||||||
readonly_fields = ("user", "email")
|
readonly_fields = ("user", "email")
|
||||||
raw_id_fields = ("current_team", )
|
raw_id_fields = ("current_project", )
|
||||||
list_select_related = ("user", )
|
list_select_related = ("user", )
|
||||||
list_display = ("id", "users", "checks", "invited",
|
list_display = ("id", "users", "checks", "invited",
|
||||||
"reports_allowed", "ping_log_limit", "sms")
|
"reports_allowed", "ping_log_limit", "sms")
|
||||||
|
21
hc/accounts/migrations/0024_auto_20190119_1540.py
Normal file
21
hc/accounts/migrations/0024_auto_20190119_1540.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# Generated by Django 2.1.5 on 2019-01-19 15:40
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('accounts', '0023_auto_20190117_1419'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='profile',
|
||||||
|
name='current_team',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='profile',
|
||||||
|
name='team_name',
|
||||||
|
),
|
||||||
|
]
|
@ -41,9 +41,7 @@ class ProfileManager(models.Manager):
|
|||||||
|
|
||||||
|
|
||||||
class Profile(models.Model):
|
class Profile(models.Model):
|
||||||
# Owner:
|
|
||||||
user = models.OneToOneField(User, models.CASCADE, blank=True, null=True)
|
user = models.OneToOneField(User, models.CASCADE, blank=True, null=True)
|
||||||
team_name = models.CharField(max_length=200, blank=True)
|
|
||||||
next_report_date = models.DateTimeField(null=True, blank=True)
|
next_report_date = models.DateTimeField(null=True, blank=True)
|
||||||
reports_allowed = models.BooleanField(default=True)
|
reports_allowed = models.BooleanField(default=True)
|
||||||
nag_period = models.DurationField(default=NO_NAG, choices=NAG_PERIODS)
|
nag_period = models.DurationField(default=NO_NAG, choices=NAG_PERIODS)
|
||||||
@ -51,7 +49,6 @@ class Profile(models.Model):
|
|||||||
ping_log_limit = models.IntegerField(default=100)
|
ping_log_limit = models.IntegerField(default=100)
|
||||||
check_limit = models.IntegerField(default=20)
|
check_limit = models.IntegerField(default=20)
|
||||||
token = models.CharField(max_length=128, blank=True)
|
token = models.CharField(max_length=128, blank=True)
|
||||||
current_team = models.ForeignKey("self", models.SET_NULL, null=True)
|
|
||||||
current_project = models.ForeignKey("Project", models.SET_NULL, null=True)
|
current_project = models.ForeignKey("Project", models.SET_NULL, null=True)
|
||||||
last_sms_date = models.DateTimeField(null=True, blank=True)
|
last_sms_date = models.DateTimeField(null=True, blank=True)
|
||||||
sms_limit = models.IntegerField(default=0)
|
sms_limit = models.IntegerField(default=0)
|
||||||
@ -62,7 +59,7 @@ class Profile(models.Model):
|
|||||||
objects = ProfileManager()
|
objects = ProfileManager()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.team_name or self.user.email
|
return "Profile for %s" % self.user.email
|
||||||
|
|
||||||
def notifications_url(self):
|
def notifications_url(self):
|
||||||
return settings.SITE_ROOT + reverse("hc-notifications")
|
return settings.SITE_ROOT + reverse("hc-notifications")
|
||||||
@ -73,13 +70,6 @@ class Profile(models.Model):
|
|||||||
path = reverse("hc-unsubscribe-reports", args=[signed_username])
|
path = reverse("hc-unsubscribe-reports", args=[signed_username])
|
||||||
return settings.SITE_ROOT + path
|
return settings.SITE_ROOT + path
|
||||||
|
|
||||||
def team(self):
|
|
||||||
# compare ids to avoid SQL queries
|
|
||||||
if self.current_team_id and self.current_team_id != self.id:
|
|
||||||
return self.current_team
|
|
||||||
|
|
||||||
return self
|
|
||||||
|
|
||||||
def prepare_token(self, salt):
|
def prepare_token(self, salt):
|
||||||
token = urlsafe_b64encode(os.urandom(24)).decode()
|
token = urlsafe_b64encode(os.urandom(24)).decode()
|
||||||
self.token = make_password(token, salt)
|
self.token = make_password(token, salt)
|
||||||
@ -185,7 +175,6 @@ class Profile(models.Model):
|
|||||||
|
|
||||||
# Switch the invited user over to the new team so they
|
# Switch the invited user over to the new team so they
|
||||||
# notice the new team on next visit:
|
# notice the new team on next visit:
|
||||||
user.profile.current_team = self
|
|
||||||
user.profile.current_project = project
|
user.profile.current_project = project
|
||||||
user.profile.save()
|
user.profile.save()
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ class CloseAccountTestCase(BaseTestCase):
|
|||||||
|
|
||||||
# Bob's current team should now be None
|
# Bob's current team should now be None
|
||||||
self.bobs_profile.refresh_from_db()
|
self.bobs_profile.refresh_from_db()
|
||||||
self.assertIsNone(self.bobs_profile.current_team)
|
|
||||||
self.assertIsNone(self.bobs_profile.current_project)
|
self.assertIsNone(self.bobs_profile.current_project)
|
||||||
|
|
||||||
# Check should be gone
|
# Check should be gone
|
||||||
@ -46,7 +45,6 @@ class CloseAccountTestCase(BaseTestCase):
|
|||||||
# Alice should be still present
|
# Alice should be still present
|
||||||
self.alice.refresh_from_db()
|
self.alice.refresh_from_db()
|
||||||
self.profile.refresh_from_db()
|
self.profile.refresh_from_db()
|
||||||
self.assertEqual(self.profile.current_team, None)
|
|
||||||
|
|
||||||
# Bob should be gone
|
# Bob should be gone
|
||||||
bobs = User.objects.filter(username="bob")
|
bobs = User.objects.filter(username="bob")
|
||||||
|
@ -173,7 +173,6 @@ class ProfileTestCase(BaseTestCase):
|
|||||||
self.assertEqual(Member.objects.count(), 0)
|
self.assertEqual(Member.objects.count(), 0)
|
||||||
|
|
||||||
self.bobs_profile.refresh_from_db()
|
self.bobs_profile.refresh_from_db()
|
||||||
self.assertEqual(self.bobs_profile.current_team, None)
|
|
||||||
self.assertEqual(self.bobs_profile.current_project, None)
|
self.assertEqual(self.bobs_profile.current_project, None)
|
||||||
|
|
||||||
def test_it_sets_team_name(self):
|
def test_it_sets_team_name(self):
|
||||||
@ -183,9 +182,6 @@ class ProfileTestCase(BaseTestCase):
|
|||||||
r = self.client.post("/accounts/profile/", form)
|
r = self.client.post("/accounts/profile/", form)
|
||||||
self.assertEqual(r.status_code, 200)
|
self.assertEqual(r.status_code, 200)
|
||||||
|
|
||||||
self.profile.refresh_from_db()
|
|
||||||
self.assertEqual(self.profile.team_name, "Alpha Team")
|
|
||||||
|
|
||||||
self.project.refresh_from_db()
|
self.project.refresh_from_db()
|
||||||
self.assertEqual(self.project.name, "Alpha Team")
|
self.assertEqual(self.project.name, "Alpha Team")
|
||||||
|
|
||||||
@ -197,7 +193,6 @@ class ProfileTestCase(BaseTestCase):
|
|||||||
# After visiting the profile page, team should be switched back
|
# After visiting the profile page, team should be switched back
|
||||||
# to user's default team.
|
# to user's default team.
|
||||||
self.bobs_profile.refresh_from_db()
|
self.bobs_profile.refresh_from_db()
|
||||||
self.assertEqual(self.bobs_profile.current_team, self.bobs_profile)
|
|
||||||
self.assertEqual(self.bobs_profile.current_project, self.bobs_project)
|
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):
|
||||||
|
@ -79,7 +79,6 @@ def _ensure_own_team(request):
|
|||||||
if request.project.owner != request.user:
|
if request.project.owner != request.user:
|
||||||
request.project = request.profile.get_own_project()
|
request.project = request.profile.get_own_project()
|
||||||
|
|
||||||
request.profile.current_team = request.profile
|
|
||||||
request.profile.current_project = request.project
|
request.profile.current_project = request.project
|
||||||
request.profile.save()
|
request.profile.save()
|
||||||
|
|
||||||
@ -247,7 +246,6 @@ def profile(request):
|
|||||||
|
|
||||||
email = form.cleaned_data["email"]
|
email = form.cleaned_data["email"]
|
||||||
farewell_user = User.objects.get(email=email)
|
farewell_user = User.objects.get(email=email)
|
||||||
farewell_user.profile.current_team = None
|
|
||||||
farewell_user.profile.current_project = None
|
farewell_user.profile.current_project = None
|
||||||
farewell_user.profile.save()
|
farewell_user.profile.save()
|
||||||
|
|
||||||
@ -259,9 +257,6 @@ def profile(request):
|
|||||||
elif "set_team_name" in request.POST:
|
elif "set_team_name" in request.POST:
|
||||||
form = TeamNameForm(request.POST)
|
form = TeamNameForm(request.POST)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
profile.team_name = form.cleaned_data["team_name"]
|
|
||||||
profile.save()
|
|
||||||
|
|
||||||
request.project.name = form.cleaned_data["team_name"]
|
request.project.name = form.cleaned_data["team_name"]
|
||||||
request.project.save()
|
request.project.save()
|
||||||
|
|
||||||
@ -445,7 +440,6 @@ def switch_team(request, target_username):
|
|||||||
if not access_ok:
|
if not access_ok:
|
||||||
return HttpResponseForbidden()
|
return HttpResponseForbidden()
|
||||||
|
|
||||||
request.profile.current_team = target_team
|
|
||||||
request.profile.current_project = target_project
|
request.profile.current_project = target_project
|
||||||
request.profile.save()
|
request.profile.save()
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ class DetailsTestCase(BaseTestCase):
|
|||||||
self.assertContains(r, "Cron Expression", status_code=200)
|
self.assertContains(r, "Cron Expression", status_code=200)
|
||||||
|
|
||||||
def test_it_allows_cross_team_access(self):
|
def test_it_allows_cross_team_access(self):
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
self.client.login(username="bob@example.org", password="password")
|
self.client.login(username="bob@example.org", password="password")
|
||||||
|
@ -77,7 +77,7 @@ class LogTestCase(BaseTestCase):
|
|||||||
self.assertContains(r, "Called webhook foo/$NAME", status_code=200)
|
self.assertContains(r, "Called webhook foo/$NAME", status_code=200)
|
||||||
|
|
||||||
def test_it_allows_cross_team_access(self):
|
def test_it_allows_cross_team_access(self):
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
url = "/checks/%s/log/" % self.check.code
|
url = "/checks/%s/log/" % self.check.code
|
||||||
|
@ -26,7 +26,7 @@ class PauseTestCase(BaseTestCase):
|
|||||||
self.assertEqual(r.status_code, 405)
|
self.assertEqual(r.status_code, 405)
|
||||||
|
|
||||||
def test_it_allows_cross_team_access(self):
|
def test_it_allows_cross_team_access(self):
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
self.client.login(username="bob@example.org", password="password")
|
self.client.login(username="bob@example.org", password="password")
|
||||||
|
@ -44,7 +44,7 @@ class LastPingTestCase(BaseTestCase):
|
|||||||
self.assertContains(r, "bar-456", status_code=200)
|
self.assertContains(r, "bar-456", status_code=200)
|
||||||
|
|
||||||
def test_it_allows_cross_team_access(self):
|
def test_it_allows_cross_team_access(self):
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
check = Check.objects.create(project=self.project)
|
check = Check.objects.create(project=self.project)
|
||||||
|
@ -48,7 +48,7 @@ class RemoveCheckTestCase(BaseTestCase):
|
|||||||
self.assertEqual(r.status_code, 405)
|
self.assertEqual(r.status_code, 405)
|
||||||
|
|
||||||
def test_it_allows_cross_team_access(self):
|
def test_it_allows_cross_team_access(self):
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
self.client.login(username="bob@example.org", password="password")
|
self.client.login(username="bob@example.org", password="password")
|
||||||
|
@ -24,7 +24,7 @@ class MyChecksTestCase(BaseTestCase):
|
|||||||
self.assertIn("Never", detail["last_ping"])
|
self.assertIn("Never", detail["last_ping"])
|
||||||
|
|
||||||
def test_it_allows_cross_team_access(self):
|
def test_it_allows_cross_team_access(self):
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
self.client.login(username="bob@example.org", password="password")
|
self.client.login(username="bob@example.org", password="password")
|
||||||
@ -32,7 +32,7 @@ class MyChecksTestCase(BaseTestCase):
|
|||||||
self.assertEqual(r.status_code, 200)
|
self.assertEqual(r.status_code, 200)
|
||||||
|
|
||||||
def test_it_checks_ownership(self):
|
def test_it_checks_ownership(self):
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
self.client.login(username="charlie@example.org", password="password")
|
self.client.login(username="charlie@example.org", password="password")
|
||||||
|
@ -48,7 +48,7 @@ class StatusSingleTestCase(BaseTestCase):
|
|||||||
self.assertFalse("events" in doc)
|
self.assertFalse("events" in doc)
|
||||||
|
|
||||||
def test_it_allows_cross_team_access(self):
|
def test_it_allows_cross_team_access(self):
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
self.client.login(username="bob@example.org", password="password")
|
self.client.login(username="bob@example.org", password="password")
|
||||||
|
@ -46,7 +46,7 @@ class SwitchChannelTestCase(BaseTestCase):
|
|||||||
self.assertEqual(r.status_code, 400)
|
self.assertEqual(r.status_code, 400)
|
||||||
|
|
||||||
def test_it_allows_cross_team_access(self):
|
def test_it_allows_cross_team_access(self):
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
self.client.login(username="bob@example.org", password="password")
|
self.client.login(username="bob@example.org", password="password")
|
||||||
|
@ -30,8 +30,8 @@ class UpdateNameTestCase(BaseTestCase):
|
|||||||
self.assertEqual(self.check.name, "Bob Was Here")
|
self.assertEqual(self.check.name, "Bob Was Here")
|
||||||
|
|
||||||
def test_it_allows_cross_team_access(self):
|
def test_it_allows_cross_team_access(self):
|
||||||
# Bob's current team is not set
|
# Bob's current profile is not set
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
# But this should still work:
|
# But this should still work:
|
||||||
|
@ -177,7 +177,7 @@ class UpdateTimeoutTestCase(BaseTestCase):
|
|||||||
self.assertEqual(r.status_code, 405)
|
self.assertEqual(r.status_code, 405)
|
||||||
|
|
||||||
def test_it_allows_cross_team_access(self):
|
def test_it_allows_cross_team_access(self):
|
||||||
self.bobs_profile.current_team = None
|
self.bobs_profile.current_project = None
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
payload = {"kind": "simple", "timeout": 3600, "grace": 60}
|
payload = {"kind": "simple", "timeout": 3600, "grace": 60}
|
||||||
|
@ -38,7 +38,6 @@ def billing(request):
|
|||||||
if request.project.owner != request.user:
|
if request.project.owner != request.user:
|
||||||
request.project = request.profile.get_own_project()
|
request.project = request.profile.get_own_project()
|
||||||
|
|
||||||
request.profile.current_team = request.profile
|
|
||||||
request.profile.current_project = request.project
|
request.profile.current_project = request.project
|
||||||
request.profile.save()
|
request.profile.save()
|
||||||
|
|
||||||
|
@ -33,7 +33,6 @@ class BaseTestCase(TestCase):
|
|||||||
self.bobs_project.save()
|
self.bobs_project.save()
|
||||||
|
|
||||||
self.bobs_profile = Profile(user=self.bob)
|
self.bobs_profile = Profile(user=self.bob)
|
||||||
self.bobs_profile.current_team = self.profile
|
|
||||||
self.bobs_profile.current_project = self.project
|
self.bobs_profile.current_project = self.project
|
||||||
self.bobs_profile.save()
|
self.bobs_profile.save()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user