django-restit 4.2.72__py3-none-any.whl → 4.2.74__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
account/models/device.py CHANGED
@@ -113,9 +113,20 @@ class MemberDeviceMetaData(rm.MetaDataBase):
113
113
 
114
114
  class CloudCredentials(models.Model, rm.RestModel, rm.MetaDataModel):
115
115
  """
116
- MemberDevice Model tracks personal devices associated with a user.
117
- This can include mobile and desktop devices.
116
+ CloudCredentials is a global setting for a group to store this groups cloud credentials.
118
117
  """
118
+ class RestMeta:
119
+ VIEW_PERMS = ["view_cm", "manage_cm"]
120
+ EDIT_PERMS = ["manage_cm"]
121
+ GRAPHS = {
122
+ "default": {
123
+ "extra": ["metadata"],
124
+ "graphs": {
125
+ "group": "basic"
126
+ }
127
+ }
128
+ }
129
+
119
130
  created = models.DateTimeField(auto_now_add=True)
120
131
  modified = models.DateTimeField(auto_now=True)
121
132
  group = models.ForeignKey("account.Group", related_name="cloud_credentials", on_delete=models.CASCADE)
account/models/member.py CHANGED
@@ -88,7 +88,8 @@ class Member(User, RestModel, MetaDataModel):
88
88
  ("perms", "properties|permissions.")]
89
89
  QUERY_FIELDS_SPECIAL = {
90
90
  "ip": "auth_sessions__ip",
91
- "login_country": "auth_sessions__location__country"
91
+ "login_country": "auth_sessions__location__country",
92
+ "not_login_country": "auth_sessions__location__country__ne"
92
93
  }
93
94
  UNIQUE_LOOKUP = ["username", "email"]
94
95
  METADATA_FIELD_PROPERTIES = settings.USER_METADATA_PROPERTIES
@@ -221,6 +222,14 @@ class Member(User, RestModel, MetaDataModel):
221
222
  return token.secure_token
222
223
  return None
223
224
 
225
+ @property
226
+ def force_single_session(self):
227
+ return self.hasPermission("force_single_session")
228
+
229
+ @property
230
+ def email_disabled(self):
231
+ return self.hasPermission("email_disabled")
232
+
224
233
  @property
225
234
  def has_totp(self):
226
235
  token = self.getProperty("totp_token", category="secrets", default=None)
@@ -617,7 +626,11 @@ class Member(User, RestModel, MetaDataModel):
617
626
  email = self.email
618
627
  valid_email = email is not None and "@" in email and "invalid" not in email
619
628
  allow_sms = not email_only and phone and (force or via in ["all", "sms"])
620
- allow_email = valid_email and (force or via in ["all", "email"])
629
+ if not force:
630
+ allow_email = not self.email_disabled and valid_email and (force or via in ["all", "email"])
631
+ else:
632
+ allow_email = valid_email
633
+
621
634
  if not allow_email and not allow_sms:
622
635
  return False
623
636
 
@@ -847,6 +860,8 @@ class Member(User, RestModel, MetaDataModel):
847
860
  if token is None:
848
861
  token = AuthToken(member=self, role="default")
849
862
  token.generateToken()
863
+ elif action == "refresh_keys":
864
+ self.refreshSecurityToken()
850
865
 
851
866
  def set_full_name(self, value):
852
867
  self.set_name(value)
@@ -1042,7 +1057,7 @@ class Member(User, RestModel, MetaDataModel):
1042
1057
  return Member.objects.filter(phone_number=phone_number.lower()).last()
1043
1058
 
1044
1059
  @staticmethod
1045
- def GetWithPermission(perm, email_list=False):
1060
+ def GetWithPermission(perm, email_list=False, ignore_disabled_email=True):
1046
1061
  if type(perm) is list:
1047
1062
  queries = [Q(properties__category="permissions", properties__key=p, properties__value="1") for p in perm]
1048
1063
  query = queries.pop()
@@ -1052,12 +1067,17 @@ class Member(User, RestModel, MetaDataModel):
1052
1067
  else:
1053
1068
  qset = Member.objects.filter(is_active=True).filter(properties__category="permissions", properties__key=perm, properties__value="1")
1054
1069
 
1070
+ if not ignore_disabled_email:
1071
+ qset = qset.exclude(
1072
+ properties__category="permissions",
1073
+ properties__key="email_disabled",
1074
+ properties__int_value=1)
1055
1075
  if email_list:
1056
1076
  return list(qset.exclude(email__icontains="invalid").values_list('email', flat=True))
1057
1077
  return qset
1058
1078
 
1059
1079
  @staticmethod
1060
- def GetWithNotification(perm, email_list=False, exclude_member=None):
1080
+ def GetWithNotification(perm, email_list=False, exclude_member=None, ignore_disabled_email=True):
1061
1081
  qset = Member.objects.filter(is_active=True)
1062
1082
  if exclude_member:
1063
1083
  qset = qset.exclude(pk=exclude_member.pk)
@@ -1080,6 +1100,11 @@ class Member(User, RestModel, MetaDataModel):
1080
1100
  properties__key=perm,
1081
1101
  properties__int_value=1)
1082
1102
 
1103
+ if not ignore_disabled_email:
1104
+ qset = qset.exclude(
1105
+ properties__category="permissions",
1106
+ properties__key="email_disabled",
1107
+ properties__int_value=1)
1083
1108
  if email_list:
1084
1109
  return list(qset.exclude(email__icontains="invalid").values_list('email', flat=True))
1085
1110
  return qset
@@ -1126,7 +1151,7 @@ class Member(User, RestModel, MetaDataModel):
1126
1151
  email_only=False, sms_msg=None, force=False, from_email=None):
1127
1152
  NotificationRecord = RestModel.getModel("account", "NotificationRecord")
1128
1153
  NotificationRecord.notify(
1129
- Member.GetWithPermission(perm), subject, message,
1154
+ Member.GetWithPermission(perm, ignore_disabled_email=True), subject, message,
1130
1155
  template, context, email_only, sms_msg, force,
1131
1156
  from_email=from_email)
1132
1157
 
@@ -1136,7 +1161,8 @@ class Member(User, RestModel, MetaDataModel):
1136
1161
  exclude_member=None):
1137
1162
  NotificationRecord = RestModel.getModel("account", "NotificationRecord")
1138
1163
  NotificationRecord.notify(
1139
- Member.GetWithNotification(setting, exclude_member=exclude_member), subject, message,
1164
+ Member.GetWithNotification(setting, exclude_member=exclude_member, ignore_disabled_email=True),
1165
+ subject, message,
1140
1166
  template, context, email_only, sms_msg, force,
1141
1167
  from_email=from_email)
1142
1168
 
@@ -82,13 +82,14 @@ class Membership(models.Model, RestModel, MetaDataModel):
82
82
  if value == "resend_invite":
83
83
  self.sendInvite(self.getActiveRequest())
84
84
 
85
- def sendInvite(self, request=None, url=None, subject=None, site_logo=None, company_name=None):
85
+ def sendInvite(self, request=None, url=None, subject=None, site_logo=None, company_name=None, msg=None):
86
86
  if request:
87
87
  powered_by = request.DATA.get("powered_by", True)
88
88
  subject = request.DATA.get("invite_subject")
89
89
  url = request.DATA.get("invite_url")
90
90
  site_logo = request.DATA.get("site_logo", settings.SITE_LOGO)
91
91
  company_name = request.DATA.get("company_name", settings.COMPANY_NAME)
92
+ msg = request.DATA.get("invite_msg", None)
92
93
  else:
93
94
  powered_by = True
94
95
  site_logo = settings.SITE_LOGO
@@ -109,7 +110,7 @@ class Membership(models.Model, RestModel, MetaDataModel):
109
110
  url = "{}&auth_code={}".format(url, auth_token.toBase64())
110
111
  self.member.sendInvite(
111
112
  subject, self.group, url=url,
112
- msg=request.DATA.get("invite_msg", None),
113
+ msg=msg,
113
114
  POWERED_BY=powered_by,
114
115
  SITE_LOGO=site_logo,
115
116
  COMPANY_NAME=company_name,
account/models/notify.py CHANGED
@@ -151,12 +151,90 @@ class NotificationRecord(models.Model, RestModel):
151
151
  members = Member.objects.filter(email__in=emails)
152
152
  cls.notify(members, subject, message, template, context, email_only, sms_msg, force, from_email, attachments)
153
153
 
154
+
154
155
  @classmethod
155
156
  def notify(cls, notify_users, subject, message=None,
156
157
  template=None, context=None, email_only=False,
157
158
  sms_msg=None, force=False,
158
159
  from_email=settings.DEFAULT_FROM_EMAIL,
159
160
  attachments=[]):
161
+ dup_list = []
162
+ email_to = []
163
+ sms_to = []
164
+ for member in notify_users:
165
+ via = member.getProperty("notify_via", "all")
166
+ phone = member.getProperty("phone")
167
+ email = member.email
168
+ valid_email = email is not None and "@" in email and "invalid" not in email
169
+ allow_sms = not email_only and phone and (force or via in ["all", "sms"])
170
+ allow_email = not member.email_disabled and valid_email and (force or via in ["all", "email"])
171
+ if not allow_email and not allow_sms:
172
+ continue
173
+ if allow_email and email not in dup_list:
174
+ dup_list.append(email)
175
+ email_to.append(member)
176
+ if not email_only and allow_sms and phone not in dup_list:
177
+ dup_list.append(phone)
178
+ sms_to.append(phone)
179
+
180
+ if len(dup_list) == 0:
181
+ return
182
+
183
+ if not message and not template and subject:
184
+ message = subject
185
+ if not sms_msg and subject:
186
+ sms_msg = subject
187
+ if not sms_msg and message:
188
+ sms_msg = message
189
+
190
+ if subject and len(subject) > 80:
191
+ epos = subject.find('. ') + 1
192
+ if epos > 10:
193
+ subject = subject[:epos]
194
+ if len(subject) > 80:
195
+ subject = subject[:80]
196
+ subject = subject[:subject.rfind(' ')] + "..."
197
+
198
+ if sms_to:
199
+ for phone in sms_to:
200
+ SMS.send(phone, sms_msg)
201
+
202
+ if not email_to:
203
+ return
204
+ for member in email_to:
205
+ cls._notifyViaEmail(member, subject, message, template, context, attachments, from_email)
206
+
207
+ @classmethod
208
+ def _notifyViaEmail(cls, member, subject, message, template, context,
209
+ attachments, from_email=None):
210
+ # lets verify the db is working
211
+ if template:
212
+ if context is None:
213
+ context = {}
214
+ if message is not None:
215
+ context["body"] = message
216
+ context["unsubscribe_token"] = member.getUUID()
217
+ message = inbox.utils.renderTemplate(template, context)
218
+
219
+ nr = NotificationMemberRecord(member=member, to_addr=member.email)
220
+ email_record = NotificationRecord(
221
+ method="email",
222
+ subject=subject,
223
+ from_addr=from_email,
224
+ body=message)
225
+ try:
226
+ email_record.save()
227
+ email_record.addAttachments(attachments)
228
+ email_record.send([nr])
229
+ except Exception as err:
230
+ rh.log_exception("email send failed", email_to)
231
+
232
+ @classmethod
233
+ def notifyLegacy(cls, notify_users, subject, message=None,
234
+ template=None, context=None, email_only=False,
235
+ sms_msg=None, force=False,
236
+ from_email=settings.DEFAULT_FROM_EMAIL,
237
+ attachments=[]):
160
238
  # this will create a record for each email address message is sent to
161
239
  from telephony.models import SMS
162
240
  email_to = []
@@ -165,7 +243,6 @@ class NotificationRecord(models.Model, RestModel):
165
243
 
166
244
  if not message and not template and subject:
167
245
  message = subject
168
-
169
246
  if not sms_msg and subject:
170
247
  sms_msg = subject
171
248
  if not sms_msg and message:
@@ -197,7 +274,7 @@ class NotificationRecord(models.Model, RestModel):
197
274
  email = member.email
198
275
  valid_email = email is not None and "@" in email and "invalid" not in email
199
276
  allow_sms = not email_only and phone and (force or via in ["all", "sms"])
200
- allow_email = valid_email and (force or via in ["all", "email"])
277
+ allow_email = not member.email_disabled and valid_email and (force or via in ["all", "email"])
201
278
  if not allow_email and not allow_sms:
202
279
  continue
203
280
  if allow_email and email not in email_list:
@@ -226,7 +303,7 @@ class NotificationRecord(models.Model, RestModel):
226
303
  email_record.addAttachments(attachments)
227
304
  email_record.send(email_to)
228
305
  except Exception as err:
229
- print(("failed to create record: {}".format(str(err))))
306
+ rh.log_exception("email send failed", email_to)
230
307
  # we need to send emails the old way
231
308
  addrs = []
232
309
  for to in email_to:
@@ -302,6 +379,7 @@ class BounceHistory(models.Model, RestModel):
302
379
  if bounce_count > 2:
303
380
  # TODO notify support an account has been disabled because of bounce
304
381
  user.setProperty("notify_via", "off")
382
+ user.addPermission("email_disabled")
305
383
  user.log("disabled", "notifications disabled because email bounced", method="notify")
306
384
  else:
307
385
  # TODO notify support of unknown bounce
account/models/session.py CHANGED
@@ -8,7 +8,7 @@ from rest import ua
8
8
  # replacing legacy cookie session system with more robust session info
9
9
  class AuthSession(models.Model, RestModel):
10
10
  class RestMeta:
11
- SEARCH_FIELDS = ["ip", "member__username", "browser", "location__city"]
11
+ SEARCH_FIELDS = ["ip", "member__username", "browser", "location__city", "buid"]
12
12
  VIEW_PERMS = ["view_members", "manage_members", "manage_users", "owner"]
13
13
  CAN_SAVE = False
14
14
  CAN_DELETE = False
account/rpc/auth.py CHANGED
@@ -12,6 +12,7 @@ from django.http import HttpResponse
12
12
  from datetime import datetime, timedelta
13
13
 
14
14
  ALLOW_BASIC_LOGIN = settings.get("ALLOW_BASIC_LOGIN", False)
15
+ FORGET_ALWAYS_TRUE = settings.get("FORGET_ALWAYS_TRUE", True)
15
16
 
16
17
 
17
18
  @rd.urlPOST(r'^login$')
@@ -57,7 +58,7 @@ def jwt_login(request):
57
58
 
58
59
 
59
60
  def on_complete_jwt(request, member):
60
- if member.security_token is None or member.security_token == JWT_KEY:
61
+ if member.security_token is None or member.security_token == JWT_KEY or member.force_single_session:
61
62
  member.refreshSecurityToken()
62
63
 
63
64
  member.log(
@@ -301,14 +302,20 @@ def member_forgot_password(request):
301
302
  """
302
303
  member, resp = get_member_from_request(request)
303
304
  if member is None:
305
+ if FORGET_ALWAYS_TRUE:
306
+ return rv.restStatus(request, True, msg="Password reset instructions have been sent to your email. (If valid account)")
304
307
  return resp
305
308
  if resp is not None and not member.is_active:
309
+ if FORGET_ALWAYS_TRUE:
310
+ return rv.restStatus(request, True, msg="Password reset instructions have been sent to your email. (If valid account)")
306
311
  return resp
307
312
 
308
313
  if request.DATA.get("use_code", False):
309
314
  return member_forgot_password_code(request, member)
310
315
 
311
316
  if member.auth_code is not None and member.auth_code_expires > datetime.now():
317
+ if FORGET_ALWAYS_TRUE:
318
+ return rv.restStatus(request, True, msg="Password reset instructions have been sent to your email. (If valid account)")
312
319
  return rv.restPermissionDenied(request, "already sent valid auth code")
313
320
 
314
321
  member.auth_code = crypto.randomString(16)
@@ -325,7 +332,7 @@ def member_forgot_password(request):
325
332
  'to': [member.email],
326
333
  })
327
334
 
328
- return rv.restStatus(request, True, msg="Password reset instructions have been sent to your email.")
335
+ return rv.restStatus(request, True, msg="Password reset instructions have been sent to your email. (If valid account)")
329
336
 
330
337
 
331
338
  def member_forgot_password_code(request, member):
account/rpc/device.py CHANGED
@@ -5,6 +5,13 @@ from account import models as am
5
5
  from objict import objict
6
6
 
7
7
 
8
+ @rd.url(r'^group/cloud/credentials$')
9
+ @rd.url(r'^group/cloud/credentials/(?P<pk>\d+)$')
10
+ @rd.login_required
11
+ def rest_on_group_cloud_creds(request, pk=None):
12
+ return am.CloudCredentials.on_rest_request(request, pk)
13
+
14
+
8
15
  @rd.url(r'^member/device$')
9
16
  @rd.url(r'^member/device/(?P<pk>\d+)$')
10
17
  @rd.login_required
account/rpc/member.py CHANGED
@@ -1,5 +1,6 @@
1
1
  from rest import decorators as rd
2
- from rest.views import restPermissionDenied, restStatus
2
+ from rest.views import restPermissionDenied, restStatus, restHTML
3
+ from rest import helpers as rh
3
4
  from account import models as am
4
5
 
5
6
 
@@ -39,3 +40,14 @@ def rest_on_authtoken(request, pk=None):
39
40
  def rest_on_session(request, pk=None):
40
41
  return am.AuthSession.on_rest_request(request, pk)
41
42
 
43
+
44
+ @rd.urlGET('unsubscribe')
45
+ @rd.requires_params(["t"])
46
+ def rest_on_member(request):
47
+ t = request.DATA.get("t")
48
+ m = am.Member.objects.filter(uuid=t).last()
49
+ if m is not None:
50
+ m.addPermission("email_disabled")
51
+ m.reportIncident("email", f"{m.email} has unsubscribed to all email")
52
+ context = rh.getContext(request, member=m)
53
+ return restHTML(request, template="unsubscribed.html", context=context)
@@ -281,7 +281,7 @@
281
281
  <a href="{{settings.BASE_URL}}">{{settings.SITE_LABEL}}</a>
282
282
  </div>
283
283
  {% endblock %}
284
- <p style="text-align: center; font-size: 10px;">Don't want to get notifications? <a href="{{settings.BASE_URL}}rpc/account/member/unsubscribe?email={{to}}&token={{to_token}}">Unsubscribe</a>
284
+ <p style="text-align: center; font-size: 10px;">Don't want to get notifications? <a href="{{UNSUBSCRIBE_URL}}?t={{unsubscribe_token}}">Unsubscribe</a>
285
285
  </p>
286
286
  <div>
287
287
 
@@ -387,11 +387,6 @@
387
387
  <!-- START FOOTER -->
388
388
  <div class="footer">
389
389
  <table role="presentation" border="0" cellpadding="0" cellspacing="0">
390
- <tr>
391
- <td class="content-block">
392
- <br> Don't like these emails? <a href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
393
- </td>
394
- </tr>
395
390
  <tr>
396
391
  <td class="content-block powered-by">
397
392
  <div>Powered by {{SITE_LABEL}}</div>
@@ -295,13 +295,6 @@
295
295
  {% endif %}
296
296
  <tr>
297
297
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
298
- <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#000000;">
299
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
300
- </div>
301
- </td>
302
- </tr>
303
- <tr>
304
- <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
305
298
 
306
299
  <table
307
300
  align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
@@ -284,13 +284,6 @@
284
284
  </tr>
285
285
  <tr>
286
286
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
287
- <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#000000;">
288
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
289
- </div>
290
- </td>
291
- </tr>
292
- <tr>
293
- <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
294
287
 
295
288
  <table
296
289
  align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
@@ -377,11 +377,6 @@
377
377
  <!-- START FOOTER -->
378
378
  <div class="footer">
379
379
  <table role="presentation" border="0" cellpadding="0" cellspacing="0">
380
- <tr>
381
- <td class="content-block">
382
- <br> Don't like these emails? <a href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
383
- </td>
384
- </tr>
385
380
  <tr>
386
381
  <td class="content-block powered-by">
387
382
  <div>Powered by {{SITE_LABEL}}</div>
@@ -293,13 +293,6 @@
293
293
  </tr>
294
294
  <tr>
295
295
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
296
- <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#fafafa;">
297
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
298
- </div>
299
- </td>
300
- </tr>
301
- <tr>
302
- <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
303
296
 
304
297
  <table
305
298
  align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
@@ -284,13 +284,6 @@
284
284
  </tr>
285
285
  <tr>
286
286
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
287
- <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#fafafa;">
288
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
289
- </div>
290
- </td>
291
- </tr>
292
- <tr>
293
- <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
294
287
 
295
288
  <table
296
289
  align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
@@ -0,0 +1,68 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Unsubscription Successful</title>
7
+ <style>
8
+ body {
9
+ font-family: 'Arial', sans-serif;
10
+ background-color: #EDFEFD;
11
+ margin: 0;
12
+ padding: 0;
13
+ display: flex;
14
+ justify-content: center;
15
+ align-items: center;
16
+ height: 100vh;
17
+ color: #333;
18
+ }
19
+ .container {
20
+ /* background-color: white;*/
21
+ padding: 40px 60px;
22
+ /* border-radius: 10px;*/
23
+ /* box-shadow: 0 4px 8px rgba(0,0,0,0.1);*/
24
+ text-align: center;
25
+ max-width: 500px;
26
+ }
27
+ .footer {
28
+ padding: 40px 60px;
29
+ text-align: center;
30
+ }
31
+ h1 {
32
+ color: #4CAF50;
33
+ margin: 0;
34
+ }
35
+ h3 {
36
+ color: #4CAF50;
37
+ margin-top: 5px;
38
+ }
39
+ p {
40
+ margin-top: 20px;
41
+ font-size: 16px;
42
+ }
43
+ </style>
44
+ </head>
45
+ <body>
46
+ <div>
47
+ <div class="container">
48
+ <svg width="200" height="211" viewBox="0 0 200 211" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
49
+ <image id="Layer" x="11" y="0" width="179" height="211" xlink:href="data:image/png;base64, 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"/>
50
+ </svg>
51
+ {% if member %}
52
+ <h1>{{member.display_name}}</h1>
53
+ <h3>You Have Unsubscribed Successfully</h3>
54
+ {% else %}
55
+ <h1>Unsubscribed Successfully</h1>
56
+ {% endif %}
57
+
58
+ <p>You have been successfully unsubscribed from all notification. You will no longer receive any further communications from us. If this was a mistake, you can resubscribe at any time.</p>
59
+ </div>
60
+ <div class="footer">
61
+ <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center">
62
+ <div>Powered by {{SITE_LABEL}}</div>
63
+ <div>© 2023 {{COMPANY_LABEL}}</div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </body>
68
+ </html>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-restit
3
- Version: 4.2.72
3
+ Version: 4.2.74
4
4
  Summary: A Rest Framework for DJANGO
5
5
  License: MIT
6
6
  Author: Ian Starnes
@@ -24,15 +24,15 @@ account/migrations/0019_group_location.py,sha256=EfMB_w4qWUGDqQeNc453PFZwpjpTeoA
24
24
  account/migrations/0020_cloudcredentials_cloudcredentialsmetadata.py,sha256=mHwxkyDfA4ueQOt34w5ndJB4XwNTDLv79CkKgzhlz-c,2250
25
25
  account/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  account/models/__init__.py,sha256=cV_lMnT2vL_mjiYtT4hlcIHo52ocFbGSNVkOIHHLXZY,385
27
- account/models/device.py,sha256=MVWZEYrX_4zJaqmJS_feFplfVXYyqBJ-0_Fm3B1SVg8,5226
27
+ account/models/device.py,sha256=TloXvvrx3khF3BeGFuVYn6DhXjOW0AMZb4F9Fl5nBII,5491
28
28
  account/models/feeds.py,sha256=vI7fG4ASY1M0Zjke24RdnfDcuWeATl_yR_25jPmT64g,2011
29
29
  account/models/group.py,sha256=iDD_oSgswKV_t_gXZuVK80MvICrZZqdANm2jtGtOFy8,21985
30
30
  account/models/legacy.py,sha256=zYdtv4LC0ooxPVqWM-uToPwV-lYWQLorSE6p6yn1xDw,2720
31
- account/models/member.py,sha256=Pp4Np75L8TzVBC1N3g7Vnt5zy4cMBy7W0OG7mZ5Cfqg,50756
32
- account/models/membership.py,sha256=GJ6bSFLfU1CN9466k0XjSwn1sQIEwFeC8-oUYd2MrSs,9217
33
- account/models/notify.py,sha256=YnZujSHJHY7B09e6FIyZIEJRWLPYk1Sk1e92tFzB1IA,12078
31
+ account/models/member.py,sha256=_T2A1XoyJuGEiKnhFmqHihz5iEU7U_j0tpocr4-SBOo,51781
32
+ account/models/membership.py,sha256=90EpAhOsGaqphDAkONP6j_qQ0OWSRaQsI8H7E7fgMkE,9249
33
+ account/models/notify.py,sha256=Qzi8gLsVi8nDx8gpL4dyr0MPExYYGIDxZvHFUdCs7H4,15072
34
34
  account/models/passkeys.py,sha256=TJxITUi4DT4_1tW2K7ZlOcRjJuMVl2NtKz7pKQU8-Tw,1516
35
- account/models/session.py,sha256=o3t98e8itXEtkknBHdBH_PSq9kuw1A858_wl6ZleXMM,3729
35
+ account/models/session.py,sha256=ELkWjB_2KXQvPtRPrvuGJpJsqrxCQX_4J53SbqGz_2U,3737
36
36
  account/models/settings.py,sha256=gOyRWBVd3BQpjfj_hJPtqX3H46ztyRAFxBrPbv11lQg,2137
37
37
  account/oauth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  account/oauth/google.py,sha256=q5M6Qhpfp9QslKRVYFZBvtG6kgXV6vYMrR5fp6Xdb9I,2078
@@ -40,23 +40,24 @@ account/passkeys/__init__.py,sha256=FwXYJXwSJXfkLojGBcVpF1dFpgFhzDdd9N_3naYQ0cc,
40
40
  account/passkeys/core.py,sha256=xj-vXjSrfWDvc5MYtEmXzwaMkNHl-cXrQKVrN9soRCg,4126
41
41
  account/periodic.py,sha256=-u0n-7QTJgDOkasGhBAPwHAwjpqWGA-MZLEFkVTqCGU,874
42
42
  account/rpc/__init__.py,sha256=SGF0M_-H0dKh3b1apSX29BotNWAvITYccGQVC0MIjL8,336
43
- account/rpc/auth.py,sha256=oTMXstslgQSXZmTA1Achqvpqyr5eEhHf9n7iumy_D-U,15882
44
- account/rpc/device.py,sha256=fbbZFp3cUdhVXvD7gVFOqFWj4hKS3bjZKD_aF5fQxd8,2852
43
+ account/rpc/auth.py,sha256=3BJMQZ6dxE0U3HvFbedx0kBGzLzZjP8XkkcUcBobRTk,16483
44
+ account/rpc/device.py,sha256=mB14a6qvJIBnCa9ivLhPXwEt5Gk2foyqsKBtZxC506k,3070
45
45
  account/rpc/group.py,sha256=FD9GymgPY68y-gtDLsZxYVdwQJeLGpqcP4hjcDUh-GM,4022
46
- account/rpc/member.py,sha256=PU-Uz5KUI_BZFy-F-taDqAfnt_AwONYXSzUvfm7eyTw,1264
46
+ account/rpc/member.py,sha256=6QfhEnYuT_TMivkUUte7_DxAWW1JYjcloKRh9qQwWUY,1731
47
47
  account/rpc/notify.py,sha256=Q2YWejP36egeF060Hih5uX4Psv_B8NWlLLPi7iDYlIw,3344
48
48
  account/rpc/oauth.py,sha256=ISLVsR5HvKALANokaOFRvF4FTRxWtXPvVnZAYANKxpo,2864
49
49
  account/rpc/passkeys.py,sha256=5x28nYILJUMMSwfVuWYL66hfoGUXahMqOwiHhM4I3Do,1729
50
50
  account/rpc/settings.py,sha256=EvPuwW63Gp_Va0ANIPAZ894tnS_JCctQ0FzqYRdKUNM,271
51
51
  account/settings.py,sha256=XEvZdcA6p_iUpDq9NmICK8rxzIQ8NViKfrpyuYgSV4o,53
52
- account/templates/email/base.html,sha256=GnqUkoOYLDmaL370E1M-Q0PKJ60VH0MzkcjUyg9DdyY,9709
53
- account/templates/email/invite.html,sha256=bGBkV9PsAiGTsQ-7trD4-hdAIh2unWTH6fuLFL2HxSs,10567
52
+ account/templates/email/base.html,sha256=GUuatccaZtO_hLLNZmMQQKew1Bjfz3e6Z7p3dM6BrWk,9669
53
+ account/templates/email/invite.html,sha256=PnhMpf3KCnZ_2vRxRAGsRnGQU27xz0ZQhnn87_F9IFc,10346
54
54
  account/templates/email/plain/base.html,sha256=TTV8pqYGaKgzxJ7W8oZbMt2B_cNh8delFPHh-HynNv4,12600
55
- account/templates/email/plain/invite.html,sha256=Af6pcOrI4rtc4I7dasm3KlM3i1O6xljD1ZwvvtDsI2c,15235
56
- account/templates/email/plain/reset_code.html,sha256=X9lyllq8gd28BvDe9It99aA5lBmyKhhuzsBIplcDzXI,13954
57
- account/templates/email/reset_code.html,sha256=X5H7pJD-3kRL3xj_Uokf6Hs9aAQoeh1zFwmTtP2oVWY,10261
58
- account/templates/email/simple/invite.html,sha256=hI6DS9QbCcJcofPKsyQtkPVGhknALwsk8NAuOlmPorY,15147
59
- account/templates/email/simple/reset_code.html,sha256=Dln4C8jC-PI1ToS-k2VpRUjXyaHWx2udLnsIyRuM100,13944
55
+ account/templates/email/plain/invite.html,sha256=5WznpzALEWU5tRfKBdZXRMEq_Fe1Nqvl8qJpeiVZgzI,14692
56
+ account/templates/email/plain/reset_code.html,sha256=d-p0S2zav2RoJ7wAtsNIzsMxpapVhN3kyCacdjghcYI,13411
57
+ account/templates/email/reset_code.html,sha256=OxXSU4Whlqt7tVReA1LLZzhOgVXmkiAD6-96-upZtNk,10040
58
+ account/templates/email/simple/invite.html,sha256=mGXatb2n7UzcOU4KWFwxB_UQxbbFUXdpP90vSFmF_Z0,14604
59
+ account/templates/email/simple/reset_code.html,sha256=o07xdV_2em8dWfJtrgUv-xVfb48QnlnuPfbAc2ssTeM,13401
60
+ account/templates/unsubscribed.html,sha256=NywlWhgV8SAWOExwPb76bL-cQfEoYhXw2-LPdwnKJTw,57098
60
61
  auditlog/README,sha256=q4DXhdz5CuMyuxYISHXzhlHnIkRJlojwOMchLzW2qOI,520
61
62
  auditlog/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
63
  auditlog/admin.py,sha256=-q7fstdFjNeDFfbwdrxVqy0WGKxMpBwrsM7AyG1p80g,1006
@@ -87,7 +88,7 @@ inbox/models/template.py,sha256=i5vf0vsM1U0251UmVsF61MDCV_c7xt-zdCdx1SiKOG0,1013
87
88
  inbox/rpc.py,sha256=7JXvpXlEGKG7by_NkANPGYLCzagyCnTIGM4rme_htpk,1534
88
89
  inbox/utils/__init__.py,sha256=P_UR2rGK3L0tZNlTN-mf99tpeYM-tLkA18iDKXSSLDM,89
89
90
  inbox/utils/parsing.py,sha256=ae8JKm10qg6Q3dGhC29oDKKycN3yeDxI6e9SryPKxcY,4615
90
- inbox/utils/render.py,sha256=AvHROjo2ZG9dT5E1GB7ScEC8AoOogJLBriKkFP_sMYc,4218
91
+ inbox/utils/render.py,sha256=CU_F2qUBQE7mjb9Q6Dn9ro5CS_O_zEY-wDMHEClKkIA,4331
91
92
  inbox/utils/sending.py,sha256=BKelTZnbkdSLGpjOY6IRTrzj-Hnw2pPZ7RYQGwe-tqk,2179
92
93
  incident/README.md,sha256=4vbZTJj7uUmq8rogYngxqNYjFTlBOujfWUGheLoFKMc,1114
93
94
  incident/__init__.py,sha256=xgdt3z3z7ygjWv5HxhiWgBtB2W3IUJmmR88NSyUeHuo,3455
@@ -108,18 +109,18 @@ incident/migrations/0014_event_group_alter_rulecheck_index.py,sha256=v3gm5k0LVoa
108
109
  incident/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
110
  incident/models/__init__.py,sha256=NMphuhb0RTMf7Ov4QkNv7iv6_I8Wtr3xQ54yjX_a31M,209
110
111
  incident/models/event.py,sha256=WRNzvjo0jypdnQNBksOOyi-_0kVT4qWUrDZf0Aw_MPM,7355
111
- incident/models/incident.py,sha256=Jx0RnOo70BzPX4BLMVF8jB5UOYwFPKPlxWznkTeMzOU,19332
112
+ incident/models/incident.py,sha256=HPbi6J9qm7_-FMjnDUPV9NcbmP_60WU-IO9HJSpoLTY,19360
112
113
  incident/models/ossec.py,sha256=p1ptr-8lnaj1EP_VmPR58b2LmaYBGaYYKAMqhWK5yZM,2227
113
- incident/models/rules.py,sha256=uT5GhW6Flso287lJGphAlWwL20NRnHDAZoGrWBBQfeE,6260
114
+ incident/models/rules.py,sha256=SMlDRw_r3fGv-vmRojRLmsklqRRxDcjrSLVBIz-gadA,6884
114
115
  incident/models/ticket.py,sha256=S3kqGQpYLE6Y4M9IKu_60sgW-f592xNr8uufqHnvDoU,2302
115
116
  incident/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
117
  incident/parsers/ossec.py,sha256=Bc82n0AeXMBxMxzfAR-1puHyxldcikqeu5MeGRk1zMc,7142
117
118
  incident/periodic.py,sha256=eX1rQK6v65A9ugofTvJPSmAWei6C-3EYgzCMuGZ03jM,381
118
119
  incident/rpc.py,sha256=jGh1XaxDrTBIUK8Mw0ixqgPo-lqeP-MmUG1ApboAd1I,7933
119
- incident/templates/email/incident_change.html,sha256=UjFpZF1v310dWo1Kqu7SSvnEBwLSUgl0XWaCRSW8kkc,13883
120
- incident/templates/email/incident_msg.html,sha256=I2W3tXTcAQfFDoK024P77NIhFM-NnWhsJwwXTc7iGNk,13768
121
- incident/templates/email/incident_new.html,sha256=IPX3CqIrvdrZSn13_jlR6sEb0If8ftvUrUpkzC5G2Gc,15173
122
- incident/templates/email/incident_plain.html,sha256=fx4zsoldG1AQEBA6IYx5BJp_MAMizgjjx9EmuR5m4SQ,14727
120
+ incident/templates/email/incident_change.html,sha256=tQYphypwLukkVdwH0TB2Szz2VEJ7GnsfRS3_ZJ-MYeE,13895
121
+ incident/templates/email/incident_msg.html,sha256=MZdKhTddUF2MpiH8Z3RTQEmW_ko1n3ajeZ11KLtiLlU,13780
122
+ incident/templates/email/incident_new.html,sha256=W6nwFQROnyDfMlXub8s02ws4hGnJp16pfgp9xTm_aEc,15185
123
+ incident/templates/email/incident_plain.html,sha256=AyTv_3ITUwHoAO7Tv_xCODzWQXTV61EdtlphFum0BnM,14739
123
124
  incident/tq.py,sha256=6KjeTFlWAlG_l8LWMlxUGdr8ULU0uE-DB5ex0ERW440,5226
124
125
  location/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
126
  location/admin.py,sha256=6S97Rlgjkk0jM15sbT1OJRPZbgvKn2rn7duCSazOXq4,297
@@ -349,9 +350,9 @@ metrics/models.py,sha256=lD9nVzfwdav70ENulqJ8rE8Ui8EWlzdVp05rg8bAlMA,13444
349
350
  metrics/periodic.py,sha256=VmL0YG05D6k5fcNsF4QqPEU-BBPbZXjbOrp3b8EHZ-U,651
350
351
  metrics/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
351
352
  metrics/providers/aws.py,sha256=RDM5RLeFADHexm4cHaJdAm3K6iz1NwMSNcV9GYuGtjY,7432
352
- metrics/rpc.py,sha256=L6gjRAK7MNzu9haG7Uw9ECWDCdYWknM_ft7kYr4H0ts,20412
353
+ metrics/rpc.py,sha256=aPgE1yEIHM_9rdj0onMQZngxduq2Dr8EU8P2eFXPCBk,20558
353
354
  metrics/settings.py,sha256=wwHA9Z7BAHNeu3tFVn8Fh5j46KR-eGx0E8r5dzCFlAU,132
354
- metrics/tq.py,sha256=pl9RG4vXViX2hhSTOENZwXsAXD-5luXkBQjgzj4bwtk,799
355
+ metrics/tq.py,sha256=WHBRYSinmTuxF9l-_-lx0yfzEYkb0ffVMt_uvCj9bYo,825
355
356
  metrics/utils.py,sha256=w6H2v8zjlOZ5uqZsJOQvZoN-2Kyv1h8PN76gMGow7AE,11995
356
357
  pushit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
357
358
  pushit/admin.py,sha256=69HdDZU_Iz8Fm72M8r8FUztsZvW37zdGwVmj8VTqr0c,451
@@ -383,7 +384,7 @@ rest/extra/__init__.py,sha256=YzmNsch5H5FFLkUK9mIAKyoRK_rJCA9HGb0kubp4h30,54
383
384
  rest/extra/json_metadata.py,sha256=p_ffzmANmOFix_oC3voR6_NNTjcn7-T7aXcH-I4_Npg,1078
384
385
  rest/fields.py,sha256=_v1TJVc6vyWlqmwFRJ6mtuR5Fo-lS0KcUhPWIrzKZUo,9719
385
386
  rest/forms.py,sha256=66Wm5cdy8tKib_mGicjq_yd-gNVMFWRECnrDksnNnwU,6316
386
- rest/helpers.py,sha256=Af1EXjgf8JYMrP76rkgmB0SsEGES6iF9eam3jipcu48,28213
387
+ rest/helpers.py,sha256=l_vA0mdY4gZmOwzmqt-qB3DcF3aKkmteerXzJd2Qq7Q,28369
387
388
  rest/joke.py,sha256=0PpKaX2iN7jlS62kgjfmmqkFBYLPURz15aQ8R7OJkJ8,260
388
389
  rest/jwtoken.py,sha256=2BjRrnQSzm7ydHgYl6LIjfGW1YPmqjt-gDIo21O0WTk,2388
389
390
  rest/log.py,sha256=hd1_4HBOS395sfXJIL6BTw9yekm1SLgBwYx_PdfIhKA,20930
@@ -400,7 +401,7 @@ rest/middleware/request.py,sha256=JchRNy5L-bGd-7h-KFYekGRvREe2eCkZXKOYqIkP2hI,41
400
401
  rest/middleware/session.py,sha256=zHSoQpIzRLmpqr_JvW406wzpvU3W3gDbm5JhtzLAMlE,10240
401
402
  rest/middleware/session_store.py,sha256=1nSdeXK8PyuYgGgIufqrS6j6QpIrQ7zbMNT0ol75e6U,1901
402
403
  rest/models/__init__.py,sha256=M8pvFDq-WCF-QcM58X7pMufYYe0aaQ3U0PwGe9TKbbY,130
403
- rest/models/base.py,sha256=GmA1oG05qrCUtJ_rAoXiD4rYzkHhzOD8NxYbfktXV0c,67781
404
+ rest/models/base.py,sha256=MIZUQStR5Y2ndSjmOSu-NSIg3SZs9IFoMlRQ2re75OE,69565
404
405
  rest/models/cacher.py,sha256=eKz8TINVhWEqKhJGMsRkKZTtBUIv5rN3NHbZwOC56Uk,578
405
406
  rest/models/metadata.py,sha256=65GvfFbc26_7wJz8qEAzU7fEOZWVz0ttO5j5m_gs4hk,12860
406
407
  rest/net.py,sha256=LcB2QV6VNRtsSdmiQvYZgwQUDwOPMn_VBdRiZ6OpI-I,2974
@@ -417,7 +418,7 @@ rest/serializers/legacy.py,sha256=a5O-x2PqMKX8wYWrhCmdcivVbkPnru7UdyLbrhCaAdY,61
417
418
  rest/serializers/localizers.py,sha256=BegaCvTQVaruhWzvGHq3zWeVFmtBChatquRqAtkke10,410
418
419
  rest/serializers/model.py,sha256=08HJeqpmytjxvyiJFfsSRRG0uH-iK2mXCw6w0oMfWrI,8598
419
420
  rest/serializers/profiler.py,sha256=OxOimhEyvCAuzUBC9Q1dz2xaakjAqmSnekMATsjduXM,997
420
- rest/serializers/response.py,sha256=hl5ruTWKML352Nob75uc3YGTplYmBu7OMjWeEWVEs9Y,7234
421
+ rest/serializers/response.py,sha256=nUUFITnTKPDtqD5qtSRzYHFqhsG1TxO7thH81Bq-8Vk,7602
421
422
  rest/serializers/util.py,sha256=-In89fpuVTd6_Ul8nwEUt3DjVKdpeoEyAxudlyB8K6Y,2734
422
423
  rest/settings_helper.py,sha256=_Vn9nmL5_GPss9zIsXzacbTQkn99NbO42CqvOZC3ge4,1532
423
424
  rest/ssl_check.py,sha256=kH4Pk4upUEwKTAnBLR0DIKezNJHjkW3g2TdQAObEgW4,1419
@@ -501,7 +502,7 @@ ws4redis/servers/uwsgi.py,sha256=VyhoCI1DnVFqBiJYHoxqn5Idlf6uJPHvfBKgkjs34mo,172
501
502
  ws4redis/settings.py,sha256=K0yBiLUuY81iDM4Yr-k8hbvjn5VVHu5zQhmMK8Dtz0s,1536
502
503
  ws4redis/utf8validator.py,sha256=S0OlfjeGRP75aO6CzZsF4oTjRQAgR17OWE9rgZdMBZA,5122
503
504
  ws4redis/websocket.py,sha256=R0TUyPsoVRD7Y_oU7w2I6NL4fPwiz5Vl94-fUkZgLHA,14848
504
- django_restit-4.2.72.dist-info/LICENSE.md,sha256=VHN4hhEeVOoFjtG-5fVv4jesA4SWi0Z-KgOzzN6a1ps,1068
505
- django_restit-4.2.72.dist-info/METADATA,sha256=Ko43nI4kRvHs5UaYZxWSMMJ0blf1BhS-kgL5zrYj34I,7645
506
- django_restit-4.2.72.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
507
- django_restit-4.2.72.dist-info/RECORD,,
505
+ django_restit-4.2.74.dist-info/LICENSE.md,sha256=VHN4hhEeVOoFjtG-5fVv4jesA4SWi0Z-KgOzzN6a1ps,1068
506
+ django_restit-4.2.74.dist-info/METADATA,sha256=K4wtNqkXOw54ocU3LPiqrQ4f_peO9BlHQVneeYuVH1M,7645
507
+ django_restit-4.2.74.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
508
+ django_restit-4.2.74.dist-info/RECORD,,
inbox/utils/render.py CHANGED
@@ -80,6 +80,7 @@ def renderTemplate(template, context, group=None):
80
80
  context["BASE_URL"] = settings.BASE_URL
81
81
  context["SITE_LOGO"] = settings.SITE_LOGO
82
82
  context["SERVER_NAME"] = settings.SERVER_NAME
83
+ context["UNSUBSCRIBE_URL"] = settings.get("UNSUBSCRIBE_URL", f"{settings.BASE_URL}/api/account/unsubscribe")
83
84
  context["version"] = settings.VERSION
84
85
  if "COMPANY_NAME" not in context and settings.COMPANY_NAME:
85
86
  context["COMPANY_NAME"] = settings.COMPANY_NAME
@@ -424,7 +424,7 @@ class Incident(models.Model, rm.RestModel, rm.MetaDataModel):
424
424
  else:
425
425
  # notitfy everyone but the sender
426
426
  if history.by is None:
427
- members = Member.GetWithPermission(perm).exclude(pk=history.by.pk)
427
+ members = Member.GetWithPermission(perm, ignore_disabled_email=True).exclude(pk=history.by.pk)
428
428
  if members.count() == 0:
429
429
  return
430
430
  NotificationRecord = Incident.getModel("account", "NotificationRecord")
incident/models/rules.py CHANGED
@@ -26,6 +26,7 @@ added to to same incident.
26
26
  class Rule(models.Model, rm.RestModel):
27
27
  class RestMeta:
28
28
  SEARCH_FIELDS = ["name", "group__name"]
29
+ POST_SAVE_FIELDS = ["checks"]
29
30
  CAN_DELETE = True
30
31
  VIEW_PERMS = ["view_incidents"]
31
32
  # VIEW_PERMS = ["example_permission"]
@@ -50,6 +51,11 @@ class Rule(models.Model, rm.RestModel):
50
51
  "bundle_by",
51
52
  "match_by"
52
53
  ]
54
+ },
55
+ "download": {
56
+ "graphs": {
57
+ "checks": "basic"
58
+ }
53
59
  }
54
60
  }
55
61
 
@@ -102,6 +108,17 @@ class Rule(models.Model, rm.RestModel):
102
108
  return True
103
109
  return False
104
110
 
111
+ def set_checks(self, value):
112
+ if not isinstance(value, list):
113
+ return
114
+ exclude = ["id", "pk", "created", "modified", "parent"]
115
+ for item in value:
116
+ nval = {key: item[key] for key in item if key not in exclude and RuleCheck.hasField(key)}
117
+ nval["parent"] = self.id
118
+ rh.debug(nval)
119
+ obj = RuleCheck.createFromDict(self.getActiveRequest(), nval)
120
+ rh.debug("created", obj)
121
+
105
122
 
106
123
  class RuleCheck(models.Model, rm.RestModel):
107
124
  class RestMeta:
@@ -279,7 +279,7 @@ updated by: {% if history %}{{history.by.username}}{% else %}system{% endif %}
279
279
  <tr>
280
280
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
281
281
  <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#000000;">
282
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
282
+ Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{UNSUBSCRIBE_URL}}?t={{unsubscribe_token}}">Unsubscribe</a>.
283
283
  </div>
284
284
  </td>
285
285
  </tr>
@@ -278,7 +278,7 @@ New Message:
278
278
  <tr>
279
279
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
280
280
  <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#000000;">
281
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
281
+ Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{UNSUBSCRIBE_URL}}?t={{unsubscribe_token}}">Unsubscribe</a>.
282
282
  </div>
283
283
  </td>
284
284
  </tr>
@@ -296,7 +296,7 @@
296
296
  <tr>
297
297
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
298
298
  <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#000000;">
299
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
299
+ Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{UNSUBSCRIBE_URL}}?t={{unsubscribe_token}}">Unsubscribe</a>.
300
300
  </div>
301
301
  </td>
302
302
  </tr>
@@ -297,7 +297,7 @@ updated by: {% if history %}{{history.by.username}}{% else %}system{% endif %}
297
297
  <tr>
298
298
  <td align="center" style="font-size:0px;padding:10px 25px;word-break:break-word;">
299
299
  <div style="font-family:Roboto, Helvetica, Arial, sans-serif;font-size:14px;font-weight:300;line-height:20px;text-align:center;color:#000000;">
300
- Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{BASE_URL}}member/unsubscribe/">Unsubscribe</a>.
300
+ Don't like these emails? <a style="color: #c0c1ff;font-weight: bold;text-decoration: none;" href="{{UNSUBSCRIBE_URL}}?t={{unsubscribe_token}}">Unsubscribe</a>.
301
301
  </div>
302
302
  </td>
303
303
  </tr>
metrics/rpc.py CHANGED
@@ -296,11 +296,17 @@ def rest_on_ec2_restit_stats(request, pk=None):
296
296
  host = f"{name}.{hostname}"
297
297
  else:
298
298
  host = f"{name}.{hostname}"
299
- resp = net.REQUEST("GET", host, f"/{REST_PREFIX}versions", params=dict(detailed=1))
299
+ resp = net.REQUEST(
300
+ "GET", host,
301
+ f"/{REST_PREFIX}versions",
302
+ params=dict(detailed=1),
303
+ timeout=5.0)
300
304
  if resp.status:
301
305
  resp.data.id = host
302
306
  resp.data.hostname = host
303
307
  data.append(resp.data)
308
+ else:
309
+ data.append(dict(id=host, hostname=host))
304
310
  return rv.restReturn(request, dict(data=data))
305
311
 
306
312
 
@@ -594,7 +600,7 @@ def rest_on_ec2_logs(request, pk=None):
594
600
  resp = net.REQUEST(
595
601
  "GET", host,
596
602
  f"/{REST_PREFIX}metrics/logs/nginx",
597
- headers=headers, params=params)
603
+ headers=headers, params=params, timeout=30.0)
598
604
  if resp.status and resp.data:
599
605
  logs.extend(resp.data)
600
606
  return rv.restReturn(request, dict(data=logs, size=len(logs), count=len(logs)))
metrics/tq.py CHANGED
@@ -16,7 +16,7 @@ def checkDomains(task):
16
16
  alarm_date = now + timedelta(days=30)
17
17
  result = ssl_check.check(*settings.DOMAIN_WATCH)
18
18
  for key, value in result.items():
19
- if value is None:
19
+ if value is None or isinstance(value, str):
20
20
  continue
21
21
  if value < alarm_date:
22
22
  task.log(f"{key} is expiring soon")
rest/helpers.py CHANGED
@@ -471,7 +471,9 @@ def getContext(request, *args, **kwargs):
471
471
  "SITE_LOGO":settings.SITE_LOGO,
472
472
  "SERVER_NAME":settings.SERVER_NAME,
473
473
  "BASE_URL":settings.BASE_URL,
474
- "DISCLAIMER": settings.REST_DISCLAIMER
474
+ "DISCLAIMER": settings.REST_DISCLAIMER,
475
+ "COMPANY_LABEL": settings.COMPANY_LABEL,
476
+ "UNSUBSCRIBE_URL": settings.get("UNSUBSCRIBE_URL", f"{settings.BASE_URL}api/account/unsubscribe")
475
477
  }
476
478
 
477
479
  if request:
rest/models/base.py CHANGED
@@ -394,6 +394,8 @@ class RestModel(object):
394
394
  return
395
395
  if not hasattr(self, "_field_names__"):
396
396
  self._field_names__ = [f.name for f in self._meta.get_fields()]
397
+ # if not hasattr(self, "_related_field_names__"):
398
+ # self._related_field_names__ = self.get_related_name_fields()
397
399
  # print "saving field: {0} = {1}".format(fieldname, value)
398
400
  if fieldname in RestModel.__RestMeta__.NO_SAVE_FIELDS:
399
401
  return
@@ -479,8 +481,6 @@ class RestModel(object):
479
481
  if hasattr(self, fieldname) and getattr(self, fieldname) != value:
480
482
  self._changed__[fieldname] = getattr(self, fieldname)
481
483
  setattr(self, fieldname, value)
482
- # else:
483
- # print "does not have field: {0}".format(fieldname)
484
484
 
485
485
  def saveFromRequest(self, request, **kwargs):
486
486
  if "files" not in kwargs:
@@ -1064,6 +1064,10 @@ class RestModel(object):
1064
1064
  if hasattr(cls.RestMeta, "FORMATS"):
1065
1065
  fields = cls.RestMeta.FORMATS.get(format, fields)
1066
1066
  if len(fields) == 0:
1067
+ if format == "json":
1068
+ g = cls.getGraph("default")
1069
+ if "fields" in g:
1070
+ return g["fields"]
1067
1071
  no_show_fields = RestModel.__RestMeta__.NO_SHOW_FIELDS
1068
1072
  if hasattr(cls.RestMeta, "NO_SHOW_FIELDS"):
1069
1073
  no_show_fields = cls.RestMeta.NO_SHOW_FIELDS
@@ -1077,12 +1081,17 @@ class RestModel(object):
1077
1081
  def on_rest_list_format(cls, request, format, qset):
1078
1082
  if format in ["summary", "summary_only"]:
1079
1083
  return cls.on_rest_list_summary(request, qset)
1080
- fields = cls.getRestFormatFields(format)
1084
+ fields = None
1085
+ if format == "json":
1086
+ g = cls.getGraph(request.DATA.get("graph", "download"))
1087
+ if g and "fields" in g:
1088
+ fields = g["fields"]
1089
+ if fields is None:
1090
+ fields = cls.getRestFormatFields(format)
1081
1091
  if fields or format == "json":
1082
1092
  name = request.DATA.get("format_filename", None)
1083
1093
  format_size = request.DATA.get("format_size", 10000)
1084
1094
  localize = request.DATA.get("localize", None, field_type=dict)
1085
- rh.debug("localize", localize)
1086
1095
  if name is None:
1087
1096
  ext = format
1088
1097
  if "_" in ext:
@@ -1157,6 +1166,14 @@ class RestModel(object):
1157
1166
  output[lbl] = rh.getMax(act_qset, field)
1158
1167
  return GRAPH_HELPERS.restGet(request, output)
1159
1168
 
1169
+ @classmethod
1170
+ def getRestBatchCreateFilter(cls, item, exclude=["id", "pk", "created", "modified"], include=None):
1171
+ if isinstance(include, list):
1172
+ return {key: item[key] for key in include if key in item}
1173
+ # ignore related fields
1174
+ rfs = cls.get_related_name_fields()
1175
+ return {key: item[key] for key in item if key not in exclude and cls.hasField(key) and key not in rfs}
1176
+
1160
1177
  @classmethod
1161
1178
  def on_rest_batch(cls, request, action):
1162
1179
  # this method is called when rest_batch='somme action'
@@ -1185,19 +1202,38 @@ class RestModel(object):
1185
1202
  count = qset.update(**update_fields)
1186
1203
  return GRAPH_HELPERS.restStatus(request, True, error="updated {} items".format(count))
1187
1204
  elif action == "create":
1188
- batch_data = request.DATA.getlist("batch_data", [])
1189
- items = []
1190
- for item in batch_data:
1191
- try:
1192
- obj = cls.ro_objects().filter(**item).last()
1193
- if not obj:
1194
- obj.checkPermsAndSave(request, item)
1195
- items.append(obj)
1196
- except Exception:
1197
- pass
1198
- return GRAPH_HELPERS.restList(request, items)
1205
+ cls.on_rest_batch_create(request)
1199
1206
  return GRAPH_HELPERS.restStatus(request, False, error="not implemented")
1200
1207
 
1208
+ @classmethod
1209
+ def on_rest_batch_create(cls, request):
1210
+ batch_data = request.DATA.get("batch_data")
1211
+ if isinstance(batch_data, str):
1212
+ batch_data = objict.fromJSON(batch_data)
1213
+ if isinstance(batch_data, dict):
1214
+ if "data" in batch_data:
1215
+ batch_data = batch_data["data"]
1216
+ items = []
1217
+ for item in batch_data:
1218
+ obj = cls.createFromBatch(item)
1219
+ if obj:
1220
+ items.append(obj)
1221
+ return GRAPH_HELPERS.restList(request, items)
1222
+
1223
+ @classmethod
1224
+ def createFromBatch(cls, item, request=None):
1225
+ obj = None
1226
+ try:
1227
+ rh.debug("batch item", item)
1228
+ item_filter = cls.getRestBatchCreateFilter(item)
1229
+ rh.debug("batch filters", item_filter)
1230
+ obj = cls.ro_objects().filter(**item_filter).last()
1231
+ if obj is None:
1232
+ obj = cls.createFromDict(request, item)
1233
+ except Exception:
1234
+ rh.log_exception(item)
1235
+ return obj
1236
+
1201
1237
  @classmethod
1202
1238
  def on_rest_create(cls, request, pk=None):
1203
1239
  # permissions are checked in the save routine
@@ -1526,6 +1562,7 @@ class RestModel(object):
1526
1562
  <field_name>=<operator>:value
1527
1563
  """
1528
1564
  q = {}
1565
+ exq = {}
1529
1566
  field_names = cls.rest_getQueryFields()
1530
1567
  query_keys = request.DATA.keys()
1531
1568
  special_keys = getattr(cls.RestMeta, "QUERY_FIELDS_SPECIAL", {})
@@ -1597,6 +1634,8 @@ class RestModel(object):
1597
1634
  if oper == "in":
1598
1635
  if isinstance(value, str) and ',' in value:
1599
1636
  value = [a.strip() for a in value.split(',')]
1637
+ elif oper == "isnull":
1638
+ value = value in [True, "true", 1, "1"]
1600
1639
  elif oper is None and value in ["null", "None"]:
1601
1640
  key = "{}__isnull".format(key)
1602
1641
  value = True
@@ -1607,8 +1646,12 @@ class RestModel(object):
1607
1646
  value = rh.toInteger(value)
1608
1647
  q[key] = value
1609
1648
  if bool(q):
1610
- # rh.debug("queryFromRequest", q, "default_filters:", request.default_rest_filters)
1611
- qset = qset.filter(**q)
1649
+ exq = {key[:-4]: q[key] for key in q if key.endswith("__ne")}
1650
+ q = {key: q[key] for key in q if not key.endswith("__ne")}
1651
+ if bool(exq):
1652
+ qset = qset.exclude(**exq)
1653
+ if bool(q):
1654
+ qset = qset.filter(**q)
1612
1655
  return qset
1613
1656
 
1614
1657
  @classmethod
@@ -1671,6 +1714,10 @@ class RestModel(object):
1671
1714
  '''returns the internal field type'''
1672
1715
  return [field.name for field in cls._meta.fields if field.get_internal_type() == "ForeignKey"]
1673
1716
 
1717
+ @classmethod
1718
+ def get_related_name_fields(cls):
1719
+ return [f.related_name for f in cls._meta.related_objects]
1720
+
1674
1721
  @classmethod
1675
1722
  def get_fk_model(cls, fieldname):
1676
1723
  '''returns None if not foreignkey, otherswise the relevant model'''
@@ -147,6 +147,14 @@ def restExcel(request, qset, fields, name, size=10000, localize=None, **kwargs):
147
147
  return excel.qsetToExcel(request, qset[:size], fields, name)
148
148
 
149
149
 
150
+ def restHTML(request, html_content=None, template=None, context=None, status=200):
151
+ if not html_content and not template:
152
+ return HttpResponse("<html><body><h1>Hello, World!</h1><p>Welcome to my site.</p></body></html>")
153
+ if template:
154
+ return render(request, template, context, status=status)
155
+ return HttpResponse(html_content, status=status)
156
+
157
+
150
158
  def parse_accept_list(request):
151
159
  if request and hasattr(request, "DATA") and request.DATA.get('_type', None) is not None:
152
160
  accept_list = [request.DATA.get('_type')]