django-restit 4.2.134__py3-none-any.whl → 4.2.136__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
account/models/group.py CHANGED
@@ -132,14 +132,27 @@ class Group(models.Model, RestModel, MetaDataModel):
132
132
  ]
133
133
  }
134
134
 
135
+ _tz_long = None
136
+ _tz_short = None
137
+ _eod_hour = None
138
+
135
139
  @property
136
140
  def timezone(self):
137
- return self.getProperty("timezone", "America/Los_Angeles")
141
+ if self._tz_long is None:
142
+ self._tz_long = self.getParentProperty("timezone", "America/Los_Angeles")
143
+ return self._tz_long
138
144
 
139
145
  @property
140
146
  def timezone_short(self):
141
- zone = self.getProperty("timezone", "America/Los_Angeles")
142
- return rh.getShortTZ(zone)
147
+ if self._tz_short is None:
148
+ self._tz_short = rh.getShortTZ(self.timezone)
149
+ return self._tz_short
150
+
151
+ @property
152
+ def end_of_day_hour(self):
153
+ if self._eod_hour is None:
154
+ self._eod_hour = self.getParentProperty("eod", 0, field_type=int)
155
+ return self._eod_hour
143
156
 
144
157
  @property
145
158
  def file_safe_name(self):
@@ -234,6 +247,8 @@ class Group(models.Model, RestModel, MetaDataModel):
234
247
 
235
248
  def set_timezone(self, value):
236
249
  if self.pk:
250
+ self._tz_long = None
251
+ self._tz_short = None
237
252
  self.setProperty("timezone", value)
238
253
 
239
254
  def getChildModels(self, Model, grand_children=False, great_grand_children=False):
@@ -341,35 +356,39 @@ class Group(models.Model, RestModel, MetaDataModel):
341
356
  return True
342
357
  return False
343
358
 
359
+ def getParentProperty(self, key, default=None, category=None, field_type=None, decrypted=False):
360
+ val = self.getProperty(key, rh.UNKNOWN, category, field_type, decrypted)
361
+ if val != rh.UNKNOWN:
362
+ return val
363
+ if self.parent:
364
+ val = self.parent.getProperty(key, rh.UNKNOWN, category, field_type, decrypted)
365
+ if val != rh.UNKNOWN:
366
+ return val
367
+ return self.parent.getParentProperty(key, default, category, field_type, decrypted)
368
+ return default
369
+
344
370
  def getLocalTime(self, when=None, tz_aware=False):
345
- zone = self.getProperty("timezone", "America/Los_Angeles")
346
- return rh.convertToLocalTime(zone, when, tz_aware)
371
+ return rh.convertToLocalTime(self.timezone, when, tz_aware)
347
372
 
348
373
  def getUTC(self, when):
349
- zone = self.getProperty("timezone", "America/Los_Angeles")
350
- return rh.convertToUTC(zone, when)
374
+ return rh.convertToUTC(self.timezone, when)
351
375
 
352
376
  def getBusinessDay(self, start=None, end=None, kind="day"):
353
- zone = self.getProperty("timezone", "America/Los_Angeles")
354
- eod = self.getProperty("eod", 0, field_type=int)
355
- return rh.getDateRange(start, end, kind, zone, hour=eod)
377
+ return rh.getDateRange(start, end, kind, self.timezone, hour=self.end_of_day_hour)
356
378
 
357
379
  def getOperatingHours(self, start=None, end=None, kind="day"):
358
380
  # deprecate this, operating hours is deceptive
359
- zone = self.getProperty("timezone", "America/Los_Angeles")
360
- eod = self.getProperty("eod", 0, field_type=int)
361
- return rh.getDateRange(start, end, kind, zone, hour=eod)
381
+ return rh.getDateRange(start, end, kind, self.timezone, hour=self.end_of_day_hour)
362
382
 
363
383
  def getTimeZoneOffset(self, when=None, hour=None):
364
- zone = self.getProperty("timezone", "America/Los_Angeles")
365
- return rh.getTimeZoneOffset(zone, when, hour=hour)
384
+ return rh.getTimeZoneOffset(self.timezone, when, hour=hour)
366
385
 
367
386
  def getEOD(self, eod=None, onday=None, in_local=False):
368
387
  if eod is None:
369
- eod = self.getProperty("eod", 0, field_type=int)
388
+ eod = self.end_of_day_hour
370
389
  if in_local:
371
390
  return eod
372
- offset = self.getTimeZoneOffset(onday, hour=eod)
391
+ offset = self.getTimeZoneOffset(onday, hour=self.end_of_day_hour)
373
392
  return offset
374
393
 
375
394
  def updateUUID(self):
account/models/member.py CHANGED
@@ -589,14 +589,18 @@ class Member(User, RestModel, MetaDataModel):
589
589
  email_only=True, attachments=attachments)
590
590
 
591
591
  def sendInvite(self, subject, group=None, url=None, msg=None, **kwargs):
592
- if url is None:
593
- url = settings.DEFAULT_LOGIN_URL
592
+ if url is None and group is not None:
593
+ url = group.getParentProperty("default_portal")
594
+ if url is None:
595
+ url = settings.DEFAULT_LOGIN_URL
594
596
  if url[:4] != "http":
595
597
  url = f"https://{url}"
596
598
  from_domain = rh.parseHostName(url, True)
597
599
  from_email = rh.getFromEmailForHost(from_domain)
600
+ portal_domain = rh.parseHostName(url, False)
598
601
  self.member.setProperty("default_domain", from_domain)
599
602
  self.member.setProperty("default_from_email", from_email)
603
+ self.member.setProperty("default_portal", portal_domain)
600
604
  context = rh.getContext(
601
605
  self.getActiveRequest(),
602
606
  member=self,
account/models/notify.py CHANGED
@@ -10,6 +10,7 @@ from .member import Member
10
10
 
11
11
  from datetime import datetime, timedelta
12
12
  import threading
13
+ import incident
13
14
 
14
15
 
15
16
  def sendEmail(email_to, subject, body=None, attachments=[],
@@ -110,6 +111,14 @@ class NotificationRecord(models.Model, RestModel):
110
111
  self.state = -10
111
112
  else:
112
113
  self.state = -5
114
+ incident.event_now(
115
+ "email",
116
+ f"error sending email to: {email_to} - {self.subject}",
117
+ level=2,
118
+ subject=self.subject,
119
+ from_addr=self.from_addr,
120
+ to_addr=email_to,
121
+ details=self.reason)
113
122
  self.save()
114
123
  return True
115
124
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-restit
3
- Version: 4.2.134
3
+ Version: 4.2.136
4
4
  Summary: A Rest Framework for DJANGO
5
5
  License: MIT
6
6
  Author: Ian Starnes
@@ -28,11 +28,11 @@ account/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
28
28
  account/models/__init__.py,sha256=cV_lMnT2vL_mjiYtT4hlcIHo52ocFbGSNVkOIHHLXZY,385
29
29
  account/models/device.py,sha256=0AFeLMGk4im4KZVd3eGSyRbK4eQEXiFM2cdY8GUzihs,5934
30
30
  account/models/feeds.py,sha256=vI7fG4ASY1M0Zjke24RdnfDcuWeATl_yR_25jPmT64g,2011
31
- account/models/group.py,sha256=KnLj0cOJBg1JYo33wL-7NehD4_PCsLyEjLdX6GZJZAo,22308
31
+ account/models/group.py,sha256=N9Ow7AtV4xN5zSE9E5-msthJy0G5-3DEr2MTmvFO1kU,22887
32
32
  account/models/legacy.py,sha256=zYdtv4LC0ooxPVqWM-uToPwV-lYWQLorSE6p6yn1xDw,2720
33
- account/models/member.py,sha256=7JCf7HULo_CLqKLGbHFvFOVYSkKbVkDuUPjq0C1u2Ak,54450
33
+ account/models/member.py,sha256=FvVUoc_n7PgqxXduQRF-S4VJcl8aER5tMBxM5xsgswU,54682
34
34
  account/models/membership.py,sha256=90EpAhOsGaqphDAkONP6j_qQ0OWSRaQsI8H7E7fgMkE,9249
35
- account/models/notify.py,sha256=TOkuVBLAsbzT58FOxII_G3Cj_IDQx16vyehyEsNrDcY,15306
35
+ account/models/notify.py,sha256=YKYEXT56i98b7-ydLt5UuEVOqW7lipQMi-KuiPhcSwY,15627
36
36
  account/models/passkeys.py,sha256=TJxITUi4DT4_1tW2K7ZlOcRjJuMVl2NtKz7pKQU8-Tw,1516
37
37
  account/models/session.py,sha256=ELkWjB_2KXQvPtRPrvuGJpJsqrxCQX_4J53SbqGz_2U,3737
38
38
  account/models/settings.py,sha256=gOyRWBVd3BQpjfj_hJPtqX3H46ztyRAFxBrPbv11lQg,2137
@@ -274,7 +274,7 @@ medialib/stores/oauth2client/tools.py,sha256=OLSW5Iu7rtjGankFpjXlHBw8aAFOcIsWdDh
274
274
  medialib/stores/oauth2client/util.py,sha256=1Uc6qwqNhI3b507VtFnklX4sEZNt0MZbLAME2o6kCgg,5706
275
275
  medialib/stores/oauth2client/xsrfutil.py,sha256=4Plq0y5xEkDwvrveVA32gBRP0A3FkJ_36dIsyGHeJeA,3367
276
276
  medialib/stores/rtmpstore.py,sha256=CFRP6Ss4hbLKngbdaLvA8_oKCSe18B29-oWVgvTXMPA,500
277
- medialib/stores/s3.py,sha256=behvLC-ftoMVddJmgK5jfZsC5PVjRBPrSgXkwngNP9A,6280
277
+ medialib/stores/s3.py,sha256=puXareXUmcn6KdzOcLOY24i5dJUUewe7RNIduIBou9Y,6326
278
278
  medialib/stores/s3store.py,sha256=uKO6I-X83sD9xefCQytLyrV-7t9TSX2p476n_ZBkSHw,4583
279
279
  medialib/stores/uritemplate/__init__.py,sha256=ONWR_KRz9au0O-XUUTrO_UN7GHTmZCTKyvflUQb8wxM,4996
280
280
  medialib/stores/youtubestore.py,sha256=swXOJYfbhgzAv1NjOehjKtfYRZYk2wiPK7a7_boAulc,406
@@ -377,7 +377,7 @@ pushit/utils.py,sha256=IeTCGa-164nmB1jIsK1lu1O1QzUhS3BKfuXHGjCW-ck,2121
377
377
  rest/.gitignore,sha256=TbEvWRMnAiajCTOdhiNrd9eeCAaIjRp9PRjE_VkMM5g,118
378
378
  rest/README.md,sha256=V3ETc-cJu8PZIbKr9xSe_pA4JEUpC8Dhw4bQeVCDJPw,5460
379
379
  rest/RemoteEvents.py,sha256=nL46U7AuxIrlw2JunphR1tsXyqi-ep_gD9CYGpYbNgE,72
380
- rest/__init__.py,sha256=YSY8pyO-bS3rDXGxnPSjIFrfIY1b-rATlrQzmmOQlMc,122
380
+ rest/__init__.py,sha256=P7AsJG2-fQOZPMovCvkbEW57dyHqLdU0F4_ptZlHISg,122
381
381
  rest/arc4.py,sha256=y644IbF1ec--e4cUJ3KEYsewTCITK0gmlwa5mJruFC0,1967
382
382
  rest/cache.py,sha256=1Qg0rkaCJCaVP0-l5hZg2CIblTdeBSlj_0fP6vlKUpU,83
383
383
  rest/crypto/__init__.py,sha256=Tl0U11rgj1eBYqd6OXJ2_XSdNLumW_JkBZnaJqI6Ldw,72
@@ -393,7 +393,7 @@ rest/extra/hostinfo.py,sha256=5R23EafcNbFARyNEqdjBkqcpC8rPfmPd1zqNqle6-nM,4298
393
393
  rest/extra/json_metadata.py,sha256=p_ffzmANmOFix_oC3voR6_NNTjcn7-T7aXcH-I4_Npg,1078
394
394
  rest/fields.py,sha256=_v1TJVc6vyWlqmwFRJ6mtuR5Fo-lS0KcUhPWIrzKZUo,9719
395
395
  rest/forms.py,sha256=66Wm5cdy8tKib_mGicjq_yd-gNVMFWRECnrDksnNnwU,6316
396
- rest/helpers.py,sha256=PQ6-zTKZo85-TTI5BOO1sQVUFScirArnMz3X7_OpZN4,29450
396
+ rest/helpers.py,sha256=t7smlOUzchVno-zeq7xMJIwogAR2DeSrffWxgysOHX8,29531
397
397
  rest/joke.py,sha256=0PpKaX2iN7jlS62kgjfmmqkFBYLPURz15aQ8R7OJkJ8,260
398
398
  rest/jwtoken.py,sha256=6AIe9IpsOn44sodiV0OPYeTZZNhS8VRiakV-rOuCyGw,2444
399
399
  rest/log.py,sha256=hd1_4HBOS395sfXJIL6BTw9yekm1SLgBwYx_PdfIhKA,20930
@@ -513,7 +513,7 @@ ws4redis/servers/uwsgi.py,sha256=VyhoCI1DnVFqBiJYHoxqn5Idlf6uJPHvfBKgkjs34mo,172
513
513
  ws4redis/settings.py,sha256=K0yBiLUuY81iDM4Yr-k8hbvjn5VVHu5zQhmMK8Dtz0s,1536
514
514
  ws4redis/utf8validator.py,sha256=S0OlfjeGRP75aO6CzZsF4oTjRQAgR17OWE9rgZdMBZA,5122
515
515
  ws4redis/websocket.py,sha256=R0TUyPsoVRD7Y_oU7w2I6NL4fPwiz5Vl94-fUkZgLHA,14848
516
- django_restit-4.2.134.dist-info/LICENSE.md,sha256=VHN4hhEeVOoFjtG-5fVv4jesA4SWi0Z-KgOzzN6a1ps,1068
517
- django_restit-4.2.134.dist-info/METADATA,sha256=LxqKyOSlOPA71uj2Qp3pJYUjXAliEynIVPEeOE_sNSc,7663
518
- django_restit-4.2.134.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
519
- django_restit-4.2.134.dist-info/RECORD,,
516
+ django_restit-4.2.136.dist-info/LICENSE.md,sha256=VHN4hhEeVOoFjtG-5fVv4jesA4SWi0Z-KgOzzN6a1ps,1068
517
+ django_restit-4.2.136.dist-info/METADATA,sha256=0XTqwV9RSBBDL7jfrwHLJoRI-Rr122bpMowDHQbuLCA,7663
518
+ django_restit-4.2.136.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
519
+ django_restit-4.2.136.dist-info/RECORD,,
medialib/stores/s3.py CHANGED
@@ -12,7 +12,11 @@ from medialib import utils
12
12
  import threading
13
13
  import tempfile
14
14
 
15
- S3 = objict(KEY=settings.AWS_KEY, SECRET=settings.AWS_SECRET, BUCKET=settings.AWS_S3_BUCKET)
15
+ S3 = objict(
16
+ KEY=settings.AWS_KEY,
17
+ SECRET=settings.AWS_SECRET,
18
+ REGSION=settings.AWS_REGION,
19
+ BUCKET=settings.AWS_S3_BUCKET)
16
20
 
17
21
 
18
22
  class S3Item(object):
rest/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  from .uberdict import UberDict # noqa: F401
2
2
  from .settings_helper import settings # noqa: F401
3
3
 
4
- __version__ = "4.2.134"
4
+ __version__ = "4.2.136"
rest/helpers.py CHANGED
@@ -36,6 +36,8 @@ DEBUG_LOGGER = getLogger("debug", filename="debug.log")
36
36
  AUDITLOG_LOGGER_BY_USER = settings.get("AUDITLOG_LOGGER_BY_USER", False)
37
37
  AUDITLOG_LOGGERS = settings.get("AUDITLOG_LOGGERS", {})
38
38
  HELPER_CACHE = objict()
39
+ UNKNOWN = object()
40
+
39
41
 
40
42
  def getLoggerByRequest(request):
41
43
  logger = AUDIT_LOGGER
@@ -277,6 +279,8 @@ def parseHostName(url, root=False):
277
279
  parsed_url = urlparse(url)
278
280
  hname = parsed_url.netloc
279
281
  else:
282
+ if "/" in url:
283
+ url = url[:url.find('/')]
280
284
  hname = url
281
285
  if root and hname.count('.') > 1:
282
286
  return hname[hname.find(".")+1:]