django-restit 4.2.133__py3-none-any.whl → 4.2.135__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,20 @@ class Group(models.Model, RestModel, MetaDataModel):
132
132
  ]
133
133
  }
134
134
 
135
+ _tz_long = None
136
+ _tz_short = None
137
+
135
138
  @property
136
139
  def timezone(self):
137
- return self.getProperty("timezone", "America/Los_Angeles")
140
+ if self._tz_long is None:
141
+ self._tz_long = self.getParentProperty("timezone", "America/Los_Angeles")
142
+ return self._tz_long
138
143
 
139
144
  @property
140
145
  def timezone_short(self):
141
- zone = self.getProperty("timezone", "America/Los_Angeles")
142
- return rh.getShortTZ(zone)
146
+ if self._tz_short is None:
147
+ self._tz_short = rh.getShortTZ(self.timezone)
148
+ return self._tz_short
143
149
 
144
150
  @property
145
151
  def file_safe_name(self):
@@ -234,6 +240,8 @@ class Group(models.Model, RestModel, MetaDataModel):
234
240
 
235
241
  def set_timezone(self, value):
236
242
  if self.pk:
243
+ self._tz_long = None
244
+ self._tz_short = None
237
245
  self.setProperty("timezone", value)
238
246
 
239
247
  def getChildModels(self, Model, grand_children=False, great_grand_children=False):
@@ -341,32 +349,43 @@ class Group(models.Model, RestModel, MetaDataModel):
341
349
  return True
342
350
  return False
343
351
 
352
+ def getParentProperty(self, key, default=None, category=None, field_type=None, decrypted=False):
353
+ val = self.getProperty(key, rh.UNKNOWN, category, field_type, decrypted)
354
+ if val != rh.UNKNOWN:
355
+ return val
356
+ if self.parent:
357
+ val = self.parent.getProperty(key, rh.UNKNOWN, category, field_type, decrypted)
358
+ if val != rh.UNKNOWN:
359
+ return val
360
+ return self.parent.getParentProperty(key, default, category, field_type, decrypted)
361
+ return default
362
+
344
363
  def getLocalTime(self, when=None, tz_aware=False):
345
- zone = self.getProperty("timezone", "America/Los_Angeles")
364
+ zone = self.getParentProperty("timezone", "America/Los_Angeles")
346
365
  return rh.convertToLocalTime(zone, when, tz_aware)
347
366
 
348
367
  def getUTC(self, when):
349
- zone = self.getProperty("timezone", "America/Los_Angeles")
368
+ zone = self.getParentProperty("timezone", "America/Los_Angeles")
350
369
  return rh.convertToUTC(zone, when)
351
370
 
352
371
  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)
372
+ zone = self.getParentProperty("timezone", "America/Los_Angeles")
373
+ eod = self.getParentProperty("eod", 0, field_type=int)
355
374
  return rh.getDateRange(start, end, kind, zone, hour=eod)
356
375
 
357
376
  def getOperatingHours(self, start=None, end=None, kind="day"):
358
377
  # deprecate this, operating hours is deceptive
359
- zone = self.getProperty("timezone", "America/Los_Angeles")
360
- eod = self.getProperty("eod", 0, field_type=int)
378
+ zone = self.getParentProperty("timezone", "America/Los_Angeles")
379
+ eod = self.getParentProperty("eod", 0, field_type=int)
361
380
  return rh.getDateRange(start, end, kind, zone, hour=eod)
362
381
 
363
382
  def getTimeZoneOffset(self, when=None, hour=None):
364
- zone = self.getProperty("timezone", "America/Los_Angeles")
383
+ zone = self.getParentProperty("timezone", "America/Los_Angeles")
365
384
  return rh.getTimeZoneOffset(zone, 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.getParentProperty("eod", 0, field_type=int)
370
389
  if in_local:
371
390
  return eod
372
391
  offset = self.getTimeZoneOffset(onday, hour=eod)
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
 
account/rpc/member.py CHANGED
@@ -12,6 +12,18 @@ def rest_on_member(request, pk=None):
12
12
  return am.Member.on_rest_request(request, pk)
13
13
 
14
14
 
15
+ @rd.urlPOST('member/motd/reset')
16
+ @rd.perm_required('manage_members')
17
+ def rest_on_clear_motd(request):
18
+ key = request.DATA.get("key")
19
+ if key.startswith("viewed."):
20
+ key = key.split('.')[-1]
21
+ am.MemberMetaData.objects.filter(key=key, category="viewed").delete()
22
+ else:
23
+ am.MemberMetaData.objects.filter(key="saw_motd", category__isnull=True).delete()
24
+ return restStatus(request, True)
25
+
26
+
15
27
  @rd.url(r'^member/me$')
16
28
  @rd.login_optional
17
29
  def member_me_action(request):
auditlog/tq.py CHANGED
@@ -10,10 +10,12 @@ from rest import settings
10
10
 
11
11
  AUDITLOG_PRUNE_DAYS = settings.get("AUDITLOG_PRUNE_DAYS", 90)
12
12
  REST_LOG_PRUNE_DAYS = settings.get("REST_LOG_PRUNE_DAYS", 90)
13
- ACCOUNT_LOG_PRUNE_DAYS = settings.get("ACCOUNT_LOG_PRUNE_DAYS", 360)
13
+ ACCOUNT_LOG_PRUNE_DAYS = settings.get("ACCOUNT_LOG_PRUNE_DAYS", 640)
14
14
  ASYNC_LOG_PRUNE_DAYS = settings.get("ASYNC_LOG_PRUNE_DAYS", 14)
15
15
  SESSION_PRUNE_DAYS = settings.get("SESSION_PRUNE_DAYS", 180)
16
16
 
17
+ ACCOUNT_LOG_COMPONENTS = settings.get("ACCOUNT_LOG_COMPONENTS", ["account.Member", "account.Group"])
18
+
17
19
 
18
20
  def on_cleanup(task):
19
21
  # cleanup log files in the var directory
@@ -41,21 +43,21 @@ def on_cleanup(task):
41
43
  def cleanupAuditLogs():
42
44
  if AUDITLOG_PRUNE_DAYS:
43
45
  before = datetime.now() - timedelta(days=AUDITLOG_PRUNE_DAYS)
44
- return PersistentLog.objects.filter(when__lte=before).exclude(component__in=["account.Member", "account.Group"]).delete()[0]
46
+ return PersistentLog.objects.filter(when__lte=before).exclude(component__in=ACCOUNT_LOG_COMPONENTS).delete()[0]
45
47
  return 0
46
48
 
47
49
 
48
50
  def cleanupRestLogs():
49
51
  if REST_LOG_PRUNE_DAYS:
50
52
  before = datetime.now() - timedelta(days=REST_LOG_PRUNE_DAYS)
51
- return PersistentLog.objects.filter(when__lte=before, component__in=["rest", "action"]).exclude(component__in=["account.Member", "account.Group"]).delete()[0]
53
+ return PersistentLog.objects.filter(when__lte=before, component__in=["rest", "action"]).exclude(component__in=ACCOUNT_LOG_COMPONENTS).delete()[0]
52
54
  return 0
53
55
 
54
56
 
55
57
  def cleanupAccountLogs():
56
58
  if ACCOUNT_LOG_PRUNE_DAYS:
57
59
  before = datetime.now() - timedelta(days=ACCOUNT_LOG_PRUNE_DAYS)
58
- return PersistentLog.objects.filter(when__lte=before, component__in=["account.Member", "account.Group"]).delete()[0]
60
+ return PersistentLog.objects.filter(when__lte=before, component__in=ACCOUNT_LOG_COMPONENTS).delete()[0]
59
61
  return 0
60
62
 
61
63
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-restit
3
- Version: 4.2.133
3
+ Version: 4.2.135
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=gsCze5dxTBcDayNalujAA-v8gKx3vC2cQwuUH6Jg9Tg,23100
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
@@ -45,7 +45,7 @@ account/rpc/__init__.py,sha256=SGF0M_-H0dKh3b1apSX29BotNWAvITYccGQVC0MIjL8,336
45
45
  account/rpc/auth.py,sha256=p62tyihWvSY2zn7eaVxKcCG9qLnnZBIkwdRH81sS5_Y,16615
46
46
  account/rpc/device.py,sha256=lU2BHNPreHV0dDTjAPc7Sc-5m2JP8SiWVqiKuBfV7Fo,2281
47
47
  account/rpc/group.py,sha256=riymUK6ttv8G6SG6K-v7UCvM40WQy3HaGSeF_sEiaU0,4929
48
- account/rpc/member.py,sha256=VNRSD38mmTUCbq3cCSy3qRyquzeVEwW_8zzrtS0-vAA,1817
48
+ account/rpc/member.py,sha256=8XnJX-iri0Om4nc-V2_tDJzfCSzziKLw6dUx9egtEZE,2236
49
49
  account/rpc/notify.py,sha256=Q2YWejP36egeF060Hih5uX4Psv_B8NWlLLPi7iDYlIw,3344
50
50
  account/rpc/oauth.py,sha256=ISLVsR5HvKALANokaOFRvF4FTRxWtXPvVnZAYANKxpo,2864
51
51
  account/rpc/passkeys.py,sha256=5x28nYILJUMMSwfVuWYL66hfoGUXahMqOwiHhM4I3Do,1729
@@ -72,7 +72,7 @@ auditlog/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
72
72
  auditlog/models.py,sha256=skDAiuzR4chC-WNIaH2nm_VVcbnDD6ZtUxBwhk7UY8U,16517
73
73
  auditlog/periodic.py,sha256=AUhDeVsZtC47BJ-lklvYEegHoxAzj1RpIvRFSsM7g5E,363
74
74
  auditlog/rpc.py,sha256=gJgj3Wiar5pVsw8tuhy0jXLkqFkOr3Z-oI2DKelMRAQ,5592
75
- auditlog/tq.py,sha256=OgzJVspWI6FL92GEhDPtabYoP_Hd3zGNh0E297abz3Y,2415
75
+ auditlog/tq.py,sha256=ROcCjQhCavOgW3-8yjLrboNTAYEC5Pu2UCoenom0Law,2478
76
76
  auditlog/urls.py,sha256=GNqpN74EpYlMND2UFUdPt5rOkTYYrdbTV0W3fg4zLfQ,163
77
77
  inbox/README.md,sha256=jsklDrzD5d94r7cwgaU6Gi1HCjBDfWq7jd92qB0JYPU,2169
78
78
  inbox/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -174,7 +174,7 @@ medialib/forms.py,sha256=nrE6QTPNPiIeX7Nx4l9DEmAQeQXqFyCg1C3JEDBYJfE,5442
174
174
  medialib/migrations/0001_initial.py,sha256=H3JliH5aw7tiHef8MhrJr_9rGetqgA7UjTF-eKziRSM,20518
175
175
  medialib/migrations/0002_alter_mediaitemrendition_bytes.py,sha256=igC1R02smbNoWlk2T4uCi9cNilOsxGKD-D24fQv92dM,414
176
176
  medialib/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
177
- medialib/models.py,sha256=eTfUiYrazCHMGcyBg9fPCRxx_NMOaM_MTb7vuUOymgc,54794
177
+ medialib/models.py,sha256=hBq-xyUZB0X0TpYmywmMCuLFrOK4Su-zRfSGD1ULvk8,54995
178
178
  medialib/ocr.py,sha256=zlP7-NBiXhW7jR9pljmEPl5xzLVZpLN5QLAELQgU0Fk,1189
179
179
  medialib/pdf.py,sha256=l28WwM0JKbT9boV-b_9TFh9jhvGcrquR8GqC8wfEaLk,1275
180
180
  medialib/qrcode.py,sha256=vHyA5egXOX70EFiUDgr1njI9zcF6bXQJ_hKAQrppRow,545
@@ -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=UcJ4qn_3ls-tLEam46gewXaZeqzOJZ2DjbFhQy7G1j4,122
380
+ rest/__init__.py,sha256=jvMDmcVTsAQ0iA0xPSbOztX_yr1rfxCPVRM4H93ysos,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
@@ -410,7 +410,7 @@ rest/middleware/request.py,sha256=JchRNy5L-bGd-7h-KFYekGRvREe2eCkZXKOYqIkP2hI,41
410
410
  rest/middleware/session.py,sha256=zHSoQpIzRLmpqr_JvW406wzpvU3W3gDbm5JhtzLAMlE,10240
411
411
  rest/middleware/session_store.py,sha256=1nSdeXK8PyuYgGgIufqrS6j6QpIrQ7zbMNT0ol75e6U,1901
412
412
  rest/models/__init__.py,sha256=M8pvFDq-WCF-QcM58X7pMufYYe0aaQ3U0PwGe9TKbbY,130
413
- rest/models/base.py,sha256=dLgJcxDzSJDn8wsdZJaH7BkJDYTgkhnJX7-asolO6TA,70968
413
+ rest/models/base.py,sha256=asj1ehoq_LLcm99PbyICGG9I_GQikxilrc52tTs2YBY,71301
414
414
  rest/models/cacher.py,sha256=eKz8TINVhWEqKhJGMsRkKZTtBUIv5rN3NHbZwOC56Uk,578
415
415
  rest/models/metadata.py,sha256=1nQ7CYo9bJHoaXE_hVNaj1-Y7yqhHlf2ZlaD1IfTzic,12904
416
416
  rest/net.py,sha256=LcB2QV6VNRtsSdmiQvYZgwQUDwOPMn_VBdRiZ6OpI-I,2974
@@ -486,7 +486,7 @@ wiki/migrations/0003_page_perms.py,sha256=qJBLI7t5mgiDTKCR9qhticmbhgo2KKYq7WbHax
486
486
  wiki/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
487
487
  wiki/models/__init__.py,sha256=jE-9r_Hqpyo7ysKu9BschXOn5Zg34wUt894GwJpxA28,132
488
488
  wiki/models/faq.py,sha256=nvcEFerllQKT61kIYlasvZzRKwpXyfmQpiqkpHP1V1o,1745
489
- wiki/models/page.py,sha256=06wyZsDX57B-d_wZhSNcrNAOv-ERHlKveJ15MZc9haQ,8751
489
+ wiki/models/page.py,sha256=uIu-jVdf1Y9qXKbb5k15-8RLTltyTtoXobZJFcx8_0A,8836
490
490
  wiki/models/revision.py,sha256=St5-vz8SGvogsDL6jTWqHLE23PS5mp9iA0DUt3hWTsU,729
491
491
  wiki/periodic.py,sha256=t-UgXJIug-OLslJM_r03-5WrNKj39TxrvfuNFjVAhDs,334
492
492
  wiki/renderers/__init__.py,sha256=lLEoJvjU3ezXwBGcjleKk_kMyNeMD9MpfBlEiKayEiM,461
@@ -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.133.dist-info/LICENSE.md,sha256=VHN4hhEeVOoFjtG-5fVv4jesA4SWi0Z-KgOzzN6a1ps,1068
517
- django_restit-4.2.133.dist-info/METADATA,sha256=jMlQpj_jltlJ8hSiJoNQ5YmPrGumAhVk0L2nBVMi54s,7663
518
- django_restit-4.2.133.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
519
- django_restit-4.2.133.dist-info/RECORD,,
516
+ django_restit-4.2.135.dist-info/LICENSE.md,sha256=VHN4hhEeVOoFjtG-5fVv4jesA4SWi0Z-KgOzzN6a1ps,1068
517
+ django_restit-4.2.135.dist-info/METADATA,sha256=y5BF4iNU-96HCWsE7bLYHz9-lOK6htULuY729Hs6NwI,7663
518
+ django_restit-4.2.135.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
519
+ django_restit-4.2.135.dist-info/RECORD,,
medialib/models.py CHANGED
@@ -458,7 +458,10 @@ class MediaItem(models.Model, RestModel, MetaDataModel):
458
458
  return f's3://{settings.AWS_S3_BUCKET}'
459
459
 
460
460
  def set_rendernow(self, value):
461
- self.new_render()
461
+ if self.kind == "*":
462
+ self.saveState(200)
463
+ return
464
+ self.new_render(force_task=(self.kind == "V"))
462
465
 
463
466
  def uses(self):
464
467
  """
@@ -475,8 +478,8 @@ class MediaItem(models.Model, RestModel, MetaDataModel):
475
478
  def async_render(self, files={}):
476
479
  return self.new_render()
477
480
 
478
- def new_render(self, files={}):
479
- if TASKQUEUE_RENDERING:
481
+ def new_render(self, files={}, force_task=False):
482
+ if TASKQUEUE_RENDERING or force_task:
480
483
  Task.Publish("medialib", "on_render", {"id": self.id, "name": self.name, "kind": self.kind}, channel="tq_app_handler_medialib")
481
484
  else:
482
485
  self.createRenditions()
@@ -556,8 +559,10 @@ class MediaItem(models.Model, RestModel, MetaDataModel):
556
559
  self.kind = '*'
557
560
 
558
561
  def saveState(self, state):
559
- self.state = state
560
- return super(MediaItem, self).save()
562
+ if self.state != state:
563
+ self.state = state
564
+ return super(MediaItem, self).save()
565
+ return True
561
566
 
562
567
  def save(self, *args, **kwargs):
563
568
  if self.pk is None:
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.133"
4
+ __version__ = "4.2.135"
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:]
rest/models/base.py CHANGED
@@ -881,6 +881,15 @@ class RestModel(object):
881
881
  response_params=dict(graph=graph),
882
882
  **cls.getGraph(graph))
883
883
 
884
+ @classmethod
885
+ def restListSort(cls, request, qset):
886
+ from rest.serializers.collection import sort_list
887
+ sort = request.DATA.get("sort", getattr(cls.RestMeta, "DEFAULT_SORT", "-id"))
888
+ sort = request.DATA.get("sort")
889
+ if sort:
890
+ qset, sort_args = sort_list(qset, sort)
891
+ return qset
892
+
884
893
  @classmethod
885
894
  def toList(cls, qset, graph=None, totals=None, request=None):
886
895
  if request is None:
wiki/models/page.py CHANGED
@@ -176,6 +176,8 @@ class Page(dm.Model, rm.RestModel, rm.MetaDataModel):
176
176
 
177
177
  @classmethod
178
178
  def on_rest_list_ready(cls, request, qset=None):
179
+ # need to first sort our list
180
+ qset = cls.restListSort(request, qset)
179
181
  out = []
180
182
  for page in qset:
181
183
  if page.on_rest_can_get(request):