forked from GithubBackups/healthchecks
Fix deprecation warnings.
This commit is contained in:
parent
edb8b88d06
commit
74f7c50a65
@ -3,6 +3,7 @@ from django.contrib.auth.admin import UserAdmin
|
|||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
from django.utils.safestring import mark_safe
|
||||||
from hc.accounts.models import Profile
|
from hc.accounts.models import Profile
|
||||||
from hc.api.models import Channel, Check
|
from hc.api.models import Channel, Check
|
||||||
|
|
||||||
@ -47,6 +48,7 @@ class ProfileAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
fieldsets = (ProfileFieldset.tuple(), TeamFieldset.tuple())
|
fieldsets = (ProfileFieldset.tuple(), TeamFieldset.tuple())
|
||||||
|
|
||||||
|
@mark_safe
|
||||||
def users(self, obj):
|
def users(self, obj):
|
||||||
if obj.member_set.count() == 0:
|
if obj.member_set.count() == 0:
|
||||||
return obj.user.email
|
return obj.user.email
|
||||||
@ -55,6 +57,7 @@ class ProfileAdmin(admin.ModelAdmin):
|
|||||||
"profile": obj
|
"profile": obj
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@mark_safe
|
||||||
def checks(self, obj):
|
def checks(self, obj):
|
||||||
num_checks = Check.objects.filter(user=obj.user).count()
|
num_checks = Check.objects.filter(user=obj.user).count()
|
||||||
pct = 100 * num_checks / max(obj.check_limit, 1)
|
pct = 100 * num_checks / max(obj.check_limit, 1)
|
||||||
@ -68,9 +71,6 @@ class ProfileAdmin(admin.ModelAdmin):
|
|||||||
def email(self, obj):
|
def email(self, obj):
|
||||||
return obj.user.email
|
return obj.user.email
|
||||||
|
|
||||||
users.allow_tags = True
|
|
||||||
checks.allow_tags = True
|
|
||||||
|
|
||||||
|
|
||||||
class HcUserAdmin(UserAdmin):
|
class HcUserAdmin(UserAdmin):
|
||||||
actions = ["send_report"]
|
actions = ["send_report"]
|
||||||
|
@ -15,7 +15,7 @@ class BasicBackend(object):
|
|||||||
# Authenticate against the token in user's profile.
|
# Authenticate against the token in user's profile.
|
||||||
class ProfileBackend(BasicBackend):
|
class ProfileBackend(BasicBackend):
|
||||||
|
|
||||||
def authenticate(self, username=None, token=None):
|
def authenticate(self, request=None, username=None, token=None):
|
||||||
try:
|
try:
|
||||||
profiles = Profile.objects.select_related("user")
|
profiles = Profile.objects.select_related("user")
|
||||||
profile = profiles.get(user__username=username)
|
profile = profiles.get(user__username=username)
|
||||||
@ -30,7 +30,7 @@ class ProfileBackend(BasicBackend):
|
|||||||
|
|
||||||
class EmailBackend(BasicBackend):
|
class EmailBackend(BasicBackend):
|
||||||
|
|
||||||
def authenticate(self, username=None, password=None):
|
def authenticate(self, request=None, username=None, password=None):
|
||||||
try:
|
try:
|
||||||
user = User.objects.get(email=username)
|
user = User.objects.get(email=username)
|
||||||
except User.DoesNotExist:
|
except User.DoesNotExist:
|
||||||
|
@ -18,7 +18,7 @@ class Migration(migrations.Migration):
|
|||||||
('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID', primary_key=True)),
|
('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID', primary_key=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)),
|
||||||
('user', models.OneToOneField(blank=True, to=settings.AUTH_USER_MODEL, null=True)),
|
('user', models.OneToOneField(blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -16,6 +16,6 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='profile',
|
model_name='profile',
|
||||||
name='current_team',
|
name='current_team',
|
||||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='accounts.Profile'),
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='accounts.Profile'),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -104,5 +104,5 @@ class Profile(models.Model):
|
|||||||
|
|
||||||
|
|
||||||
class Member(models.Model):
|
class Member(models.Model):
|
||||||
team = models.ForeignKey(Profile)
|
team = models.ForeignKey(Profile, models.CASCADE)
|
||||||
user = models.ForeignKey(User)
|
user = models.ForeignKey(User, models.CASCADE)
|
||||||
|
18
hc/accounts/tests/test_admin.py
Normal file
18
hc/accounts/tests/test_admin.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
from hc.test import BaseTestCase
|
||||||
|
|
||||||
|
|
||||||
|
class AccountsAdminTestCase(BaseTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(AccountsAdminTestCase, self).setUp()
|
||||||
|
|
||||||
|
self.alice.is_staff = True
|
||||||
|
self.alice.is_superuser = True
|
||||||
|
self.alice.save()
|
||||||
|
|
||||||
|
def test_it_shows_profiles(self):
|
||||||
|
self.client.login(username="alice@example.org", password="password")
|
||||||
|
|
||||||
|
r = self.client.get("/admin/accounts/profile/")
|
||||||
|
self.assertContains(r, "alice@example.org")
|
||||||
|
self.assertContains(r, "bob@example.org")
|
@ -1,6 +1,7 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.core.paginator import Paginator
|
from django.core.paginator import Paginator
|
||||||
from django.db import connection
|
from django.db import connection
|
||||||
|
from django.utils.safestring import mark_safe
|
||||||
from hc.api.models import Channel, Check, Notification, Ping
|
from hc.api.models import Channel, Check, Notification, Ping
|
||||||
from hc.lib.date import format_duration
|
from hc.lib.date import format_duration
|
||||||
|
|
||||||
@ -164,14 +165,14 @@ class ChannelsAdmin(admin.ModelAdmin):
|
|||||||
def email(self, obj):
|
def email(self, obj):
|
||||||
return obj.user.email if obj.user else None
|
return obj.user.email if obj.user else None
|
||||||
|
|
||||||
|
@mark_safe
|
||||||
def formatted_kind(self, obj):
|
def formatted_kind(self, obj):
|
||||||
if obj.kind == "email" and not obj.email_verified:
|
if obj.kind == "email" and not obj.email_verified:
|
||||||
return "Email <i>(unverified)</i>"
|
return "Email <i>(unconfirmed)</i>"
|
||||||
|
|
||||||
return obj.get_kind_display()
|
return obj.get_kind_display()
|
||||||
|
|
||||||
formatted_kind.short_description = "Kind"
|
formatted_kind.short_description = "Kind"
|
||||||
formatted_kind.allow_tags = True
|
|
||||||
|
|
||||||
def num_notifications(self, obj):
|
def num_notifications(self, obj):
|
||||||
return Notification.objects.filter(channel=obj).count()
|
return Notification.objects.filter(channel=obj).count()
|
||||||
|
@ -19,7 +19,7 @@ class Migration(migrations.Migration):
|
|||||||
('id', models.AutoField(auto_created=True, primary_key=True, verbose_name='ID', serialize=False)),
|
('id', models.AutoField(auto_created=True, primary_key=True, verbose_name='ID', serialize=False)),
|
||||||
('code', models.UUIDField(default=uuid.uuid4, editable=False)),
|
('code', models.UUIDField(default=uuid.uuid4, editable=False)),
|
||||||
('last_ping', models.DateTimeField(null=True, blank=True)),
|
('last_ping', models.DateTimeField(null=True, blank=True)),
|
||||||
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
|
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -15,6 +15,6 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='check',
|
model_name='check',
|
||||||
name='user',
|
name='user',
|
||||||
field=models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True),
|
field=models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.CASCADE),
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -20,7 +20,7 @@ class Migration(migrations.Migration):
|
|||||||
('method', models.CharField(max_length=10)),
|
('method', models.CharField(max_length=10)),
|
||||||
('ua', models.CharField(max_length=100, blank=True)),
|
('ua', models.CharField(max_length=100, blank=True)),
|
||||||
('body', models.TextField(blank=True)),
|
('body', models.TextField(blank=True)),
|
||||||
('owner', models.ForeignKey(to='api.Check')),
|
('owner', models.ForeignKey(to='api.Check', on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -24,7 +24,7 @@ class Migration(migrations.Migration):
|
|||||||
('value', models.CharField(max_length=200, blank=True)),
|
('value', models.CharField(max_length=200, blank=True)),
|
||||||
('email_verified', models.BooleanField(default=False)),
|
('email_verified', models.BooleanField(default=False)),
|
||||||
('checks', models.ManyToManyField(to='api.Check')),
|
('checks', models.ManyToManyField(to='api.Check')),
|
||||||
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)),
|
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -18,8 +18,8 @@ class Migration(migrations.Migration):
|
|||||||
('check_status', models.CharField(max_length=6)),
|
('check_status', models.CharField(max_length=6)),
|
||||||
('created', models.DateTimeField(auto_now_add=True)),
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
('status', models.IntegerField(default=0)),
|
('status', models.IntegerField(default=0)),
|
||||||
('channel', models.ForeignKey(to='api.Channel')),
|
('channel', models.ForeignKey(to='api.Channel', on_delete=models.CASCADE)),
|
||||||
('owner', models.ForeignKey(to='api.Check')),
|
('owner', models.ForeignKey(to='api.Check', on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -56,7 +56,7 @@ class Check(models.Model):
|
|||||||
name = models.CharField(max_length=100, blank=True)
|
name = models.CharField(max_length=100, blank=True)
|
||||||
tags = models.CharField(max_length=500, blank=True)
|
tags = models.CharField(max_length=500, blank=True)
|
||||||
code = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True)
|
code = models.UUIDField(default=uuid.uuid4, editable=False, db_index=True)
|
||||||
user = models.ForeignKey(User, blank=True, null=True)
|
user = models.ForeignKey(User, models.CASCADE, blank=True, null=True)
|
||||||
created = models.DateTimeField(auto_now_add=True)
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
kind = models.CharField(max_length=10, default="simple",
|
kind = models.CharField(max_length=10, default="simple",
|
||||||
choices=CHECK_KINDS)
|
choices=CHECK_KINDS)
|
||||||
@ -204,7 +204,7 @@ class Check(models.Model):
|
|||||||
|
|
||||||
class Ping(models.Model):
|
class Ping(models.Model):
|
||||||
n = models.IntegerField(null=True)
|
n = models.IntegerField(null=True)
|
||||||
owner = models.ForeignKey(Check)
|
owner = models.ForeignKey(Check, models.CASCADE)
|
||||||
created = models.DateTimeField(auto_now_add=True)
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
scheme = models.CharField(max_length=10, default="http")
|
scheme = models.CharField(max_length=10, default="http")
|
||||||
remote_addr = models.GenericIPAddressField(blank=True, null=True)
|
remote_addr = models.GenericIPAddressField(blank=True, null=True)
|
||||||
@ -214,7 +214,7 @@ class Ping(models.Model):
|
|||||||
|
|
||||||
class Channel(models.Model):
|
class Channel(models.Model):
|
||||||
code = models.UUIDField(default=uuid.uuid4, editable=False)
|
code = models.UUIDField(default=uuid.uuid4, editable=False)
|
||||||
user = models.ForeignKey(User)
|
user = models.ForeignKey(User, models.CASCADE)
|
||||||
created = models.DateTimeField(auto_now_add=True)
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
kind = models.CharField(max_length=20, choices=CHANNEL_KINDS)
|
kind = models.CharField(max_length=20, choices=CHANNEL_KINDS)
|
||||||
value = models.TextField(blank=True)
|
value = models.TextField(blank=True)
|
||||||
@ -378,9 +378,9 @@ class Notification(models.Model):
|
|||||||
get_latest_by = "created"
|
get_latest_by = "created"
|
||||||
|
|
||||||
code = models.UUIDField(default=uuid.uuid4, null=True, editable=False)
|
code = models.UUIDField(default=uuid.uuid4, null=True, editable=False)
|
||||||
owner = models.ForeignKey(Check)
|
owner = models.ForeignKey(Check, models.CASCADE)
|
||||||
check_status = models.CharField(max_length=6)
|
check_status = models.CharField(max_length=6)
|
||||||
channel = models.ForeignKey(Channel)
|
channel = models.ForeignKey(Channel, models.CASCADE)
|
||||||
created = models.DateTimeField(auto_now_add=True)
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
error = models.CharField(max_length=200, blank=True)
|
error = models.CharField(max_length=200, blank=True)
|
||||||
|
|
||||||
|
@ -28,4 +28,4 @@ class ApiAdminTestCase(BaseTestCase):
|
|||||||
value="foo@example.org")
|
value="foo@example.org")
|
||||||
|
|
||||||
r = self.client.get("/admin/api/channel/")
|
r = self.client.get("/admin/api/channel/")
|
||||||
self.assertContains(r, "Email <i>(unverified)</i>")
|
self.assertContains(r, "Email <i>(unconfirmed)</i>")
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
|
from datetime import timedelta as td
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from django.core import mail
|
from django.core import mail
|
||||||
|
from django.utils.timezone import now
|
||||||
from hc.api.models import Channel, Check, Notification
|
from hc.api.models import Channel, Check, Notification
|
||||||
from hc.test import BaseTestCase
|
from hc.test import BaseTestCase
|
||||||
from mock import patch
|
from mock import patch
|
||||||
@ -13,6 +15,7 @@ class NotifyTestCase(BaseTestCase):
|
|||||||
self.check = Check()
|
self.check = Check()
|
||||||
self.check.status = status
|
self.check.status = status
|
||||||
self.check.user = self.alice
|
self.check.user = self.alice
|
||||||
|
self.check.last_ping = now() - td(minutes=61)
|
||||||
self.check.save()
|
self.check.save()
|
||||||
|
|
||||||
self.channel = Channel(user=self.alice)
|
self.channel = Channel(user=self.alice)
|
||||||
@ -172,7 +175,7 @@ class NotifyTestCase(BaseTestCase):
|
|||||||
payload = kwargs["json"]
|
payload = kwargs["json"]
|
||||||
attachment = payload["attachments"][0]
|
attachment = payload["attachments"][0]
|
||||||
fields = {f["title"]: f["value"] for f in attachment["fields"]}
|
fields = {f["title"]: f["value"] for f in attachment["fields"]}
|
||||||
self.assertEqual(fields["Last Ping"], "Never")
|
self.assertEqual(fields["Last Ping"], "an hour ago")
|
||||||
|
|
||||||
@patch("hc.api.transports.requests.request")
|
@patch("hc.api.transports.requests.request")
|
||||||
def test_slack_with_complex_value(self, mock_post):
|
def test_slack_with_complex_value(self, mock_post):
|
||||||
@ -280,7 +283,7 @@ class NotifyTestCase(BaseTestCase):
|
|||||||
payload = kwargs["json"]
|
payload = kwargs["json"]
|
||||||
attachment = payload["attachments"][0]
|
attachment = payload["attachments"][0]
|
||||||
fields = {f["title"]: f["value"] for f in attachment["fields"]}
|
fields = {f["title"]: f["value"] for f in attachment["fields"]}
|
||||||
self.assertEqual(fields["Last Ping"], "Never")
|
self.assertEqual(fields["Last Ping"], "an hour ago")
|
||||||
|
|
||||||
@patch("hc.api.transports.requests.request")
|
@patch("hc.api.transports.requests.request")
|
||||||
def test_pushbullet(self, mock_post):
|
def test_pushbullet(self, mock_post):
|
||||||
|
@ -19,7 +19,7 @@ class Migration(migrations.Migration):
|
|||||||
('customer_id', models.CharField(blank=True, max_length=36)),
|
('customer_id', models.CharField(blank=True, max_length=36)),
|
||||||
('payment_method_token', models.CharField(blank=True, max_length=35)),
|
('payment_method_token', models.CharField(blank=True, max_length=35)),
|
||||||
('subscription_id', models.CharField(blank=True, max_length=10)),
|
('subscription_id', models.CharField(blank=True, max_length=10)),
|
||||||
('user', models.OneToOneField(blank=True, null=True, to=settings.AUTH_USER_MODEL)),
|
('user', models.OneToOneField(blank=True, null=True, to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
@ -18,7 +18,7 @@ class SubscriptionManager(models.Manager):
|
|||||||
|
|
||||||
|
|
||||||
class Subscription(models.Model):
|
class Subscription(models.Model):
|
||||||
user = models.OneToOneField(User, blank=True, null=True)
|
user = models.OneToOneField(User, models.CASCADE, blank=True, null=True)
|
||||||
customer_id = models.CharField(max_length=36, blank=True)
|
customer_id = models.CharField(max_length=36, blank=True)
|
||||||
payment_method_token = models.CharField(max_length=35, blank=True)
|
payment_method_token = models.CharField(max_length=35, blank=True)
|
||||||
subscription_id = models.CharField(max_length=10, blank=True)
|
subscription_id = models.CharField(max_length=10, blank=True)
|
||||||
|
@ -5,7 +5,7 @@ from hc.accounts.views import login as hc_login
|
|||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^admin/login/', hc_login, {"show_password": True}),
|
url(r'^admin/login/', hc_login, {"show_password": True}),
|
||||||
url(r'^admin/', include(admin.site.urls)),
|
url(r'^admin/', admin.site.urls),
|
||||||
url(r'^accounts/', include('hc.accounts.urls')),
|
url(r'^accounts/', include('hc.accounts.urls')),
|
||||||
url(r'^', include('hc.api.urls')),
|
url(r'^', include('hc.api.urls')),
|
||||||
url(r'^', include('hc.front.urls')),
|
url(r'^', include('hc.front.urls')),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user