simo 2.0.16__py3-none-any.whl → 2.0.18__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.

Potentially problematic release.


This version of simo might be problematic. Click here for more details.

Binary file
Binary file
simo/core/models.py CHANGED
@@ -79,7 +79,7 @@ class Instance(DirtyFieldsMixin, models.Model, SimoAdminMixin):
79
79
  )
80
80
  name = models.CharField(max_length=100, db_index=True, unique=True)
81
81
  slug = models.CharField(max_length=100, db_index=True, unique=True)
82
- cover_image = ThumbnailerImageField(
82
+ cover_image = models.ImageField(
83
83
  upload_to='hub_covers', null=True, blank=True
84
84
  )
85
85
  cover_image_synced = models.BooleanField(default=False)
@@ -151,7 +151,7 @@ class Category(DirtyFieldsMixin, models.Model, SimoAdminMixin):
151
151
  instance = models.ForeignKey(Instance, on_delete=models.CASCADE)
152
152
  name = models.CharField(_('name'), max_length=40)
153
153
  icon = models.ForeignKey(Icon, on_delete=models.SET_NULL, null=True)
154
- header_image = ThumbnailerImageField(
154
+ header_image = models.ImageField(
155
155
  upload_to='categories', null=True, blank=True,
156
156
  help_text="Will be cropped down to: 830x430"
157
157
  )
simo/core/serializers.py CHANGED
@@ -4,6 +4,7 @@ import json
4
4
  from django import forms
5
5
  from collections import OrderedDict
6
6
  from django.forms.utils import ErrorDict
7
+ from django.conf import settings
7
8
  from collections.abc import Iterable
8
9
  from easy_thumbnails.files import get_thumbnailer
9
10
  from simo.core.middleware import get_current_request
@@ -51,9 +52,11 @@ class CategorySerializer(serializers.ModelSerializer):
51
52
 
52
53
  def get_header_image_thumb(self, obj):
53
54
  if obj.header_image:
54
- url = get_thumbnailer(obj.header_image).get_thumbnail(
55
+ thumbnailer = get_thumbnailer(obj.header_image.path)
56
+ thumb = thumbnailer.get_thumbnail(
55
57
  {'size': (830, 430), 'crop': True}
56
- ).url
58
+ )
59
+ url = '/' + thumb.path.strip(settings.VAR_DIR)
57
60
  request = get_current_request()
58
61
  if request:
59
62
  url = request.build_absolute_uri(url)
simo/core/tasks.py CHANGED
@@ -7,20 +7,16 @@ import datetime
7
7
  import requests
8
8
  import subprocess
9
9
  import threading
10
- import simo
11
10
  import pkg_resources
12
11
  from django.db.models import Q
13
12
  from django.db import connection
14
- from django.db import transaction
15
13
  from django.template.loader import render_to_string
16
- from easy_thumbnails.files import get_thumbnailer
17
14
  from celeryc import celery_app
18
15
  from django.utils import timezone
19
- from django.conf import settings
16
+ from easy_thumbnails.files import get_thumbnailer
20
17
  from simo.conf import dynamic_settings
21
18
  from simo.core.utils.helpers import get_self_ip
22
19
  from .models import Instance, Component, ComponentHistory, HistoryAggregate
23
- from .utils.helpers import get_random_string, is_update_available
24
20
 
25
21
 
26
22
  def supervisor_restart():
@@ -150,7 +146,8 @@ def sync_with_remote():
150
146
  if instance.share_location:
151
147
  instance_data['location'] = instance.location
152
148
  if instance.cover_image and not instance.cover_image_synced:
153
- cover_imb_path = instance.cover_image.get_thumbnail(
149
+ thumbnailer = get_thumbnailer(instance.cover_image.path)
150
+ cover_imb_path = thumbnailer.get_thumbnail(
154
151
  {'size': (880, 490), 'crop': True}
155
152
  ).path
156
153
  with open(cover_imb_path, 'rb') as img:
simo/fleet/serializers.py CHANGED
@@ -1,5 +1,5 @@
1
1
  from rest_framework import serializers
2
- from .models import InstanceOptions, Colonel, ColonelPin
2
+ from .models import InstanceOptions, Colonel, ColonelPin, Interface
3
3
 
4
4
 
5
5
  class InstanceOptionsSerializer(serializers.ModelSerializer):
@@ -25,19 +25,28 @@ class ColonelPinSerializer(serializers.ModelSerializer):
25
25
  return bool(obj.occupied_by)
26
26
 
27
27
 
28
+ class ColonelInterfaceSerializer(serializers.ModelSerializer):
29
+
30
+ class Meta:
31
+ model = Interface
32
+ fields = 'id', 'no', 'type'
33
+ read_only_fields = fields
34
+
35
+
28
36
  class ColonelSerializer(serializers.ModelSerializer):
29
37
  pins = serializers.SerializerMethodField()
38
+ interfaces = serializers.SerializerMethodField()
30
39
 
31
40
  class Meta:
32
41
  model = Colonel
33
42
  fields = (
34
43
  'id', 'uid', 'name', 'type', 'firmware_version', 'firmware_auto_update',
35
44
  'socket_connected', 'last_seen', 'enabled', 'pwm_frequency',
36
- 'logs_stream', 'pins'
45
+ 'logs_stream', 'pins', 'interfaces',
37
46
  )
38
47
  read_only_fields = [
39
48
  'uid', 'type', 'firmware_version', 'socket_connected',
40
- 'last_seen', 'pins'
49
+ 'last_seen', 'pins', 'interfaces',
41
50
  ]
42
51
 
43
52
  def get_pins(self, obj):
@@ -46,6 +55,12 @@ class ColonelSerializer(serializers.ModelSerializer):
46
55
  result.append(ColonelPinSerializer(pin).data)
47
56
  return result
48
57
 
58
+ def get_interfaces(self, obj):
59
+ result = []
60
+ for interface in obj.interfaces.all():
61
+ result.append(ColonelInterfaceSerializer(interface).data)
62
+ return result
63
+
49
64
  def update(self, instance, validated_data):
50
65
  instance = super().update(instance, validated_data)
51
66
  instance.update_config()
simo/generic/forms.py CHANGED
@@ -218,6 +218,16 @@ class AlarmGroupConfigForm(BaseComponentForm):
218
218
  required=False,
219
219
  help_text="Defines if this is your main/top global alarm group."
220
220
  )
221
+ arm_on_away = forms.ChoiceField(
222
+ required=False,
223
+ choices=(
224
+ (None, "No"),
225
+ ('on_away', "Yes"),
226
+ ('on_away_and_locked', "Yes, but only if at least one arming lock is Locked."),
227
+ ('on_away_and_locked_all', "Yes, but only if all arming locks are Locked."),
228
+ ),
229
+ help_text="Arm automatically as soon as everybody leaves.<br>"
230
+ )
221
231
  arming_locks = forms.ModelMultipleChoiceField(
222
232
  Component.objects.filter(base_type='lock'),
223
233
  label="Arming locks", required=False,
@@ -228,7 +238,9 @@ class AlarmGroupConfigForm(BaseComponentForm):
228
238
  )
229
239
  ),
230
240
  help_text="Alarm group will get armed automatically whenever "
231
- "any of assigned locks get's locked. "
241
+ "any of assigned locks changes it's state to locked. <br>"
242
+ "If Arm on away is enabled and set to work with arming locks, "
243
+ "arming will take effect only after everybody leaves."
232
244
  )
233
245
  disarming_locks = forms.ModelMultipleChoiceField(
234
246
  Component.objects.filter(base_type='lock'),
@@ -240,7 +252,7 @@ class AlarmGroupConfigForm(BaseComponentForm):
240
252
  )
241
253
  ),
242
254
  help_text="Alarm group will be disarmed automatically whenever "
243
- "any of assigned locks get's unlocked. "
255
+ "any of assigned locks changes it's state to unlocked. "
244
256
  )
245
257
  notify_on_breach = forms.IntegerField(
246
258
  required=False, min_value=0,
simo/generic/models.py CHANGED
@@ -5,6 +5,7 @@ from threading import Timer
5
5
  from django.db.models.signals import pre_save, post_save, post_delete
6
6
  from django.dispatch import receiver
7
7
  from simo.core.models import Instance, Component
8
+ from simo.users.models import InstanceUser
8
9
  from .controllers import AlarmGroup
9
10
 
10
11
 
@@ -124,6 +125,10 @@ def bind_controlling_locks_to_alarm_groups(sender, instance, *args, **kwargs):
124
125
  base_type=AlarmGroup.base_type,
125
126
  config__arming_locks__contains=instance.id
126
127
  ):
128
+ if ag.config.get(
129
+ 'arm_on_away', ''
130
+ ).startswith('on_away_and_locked'):
131
+ continue
127
132
  ag.arm()
128
133
  elif instance.value == 'unlocked':
129
134
  for ag in Component.objects.filter(
@@ -132,3 +137,39 @@ def bind_controlling_locks_to_alarm_groups(sender, instance, *args, **kwargs):
132
137
  ):
133
138
  ag.disarm()
134
139
 
140
+
141
+ @receiver(post_save, sender=InstanceUser)
142
+ def bind_alarm_groups(sender, instance, created, *args, **kwargs):
143
+ if created:
144
+ return
145
+ if instance.at_home:
146
+ return
147
+ if 'at_home' not in instance.get_dirty_fields():
148
+ return
149
+ users_at_home = InstanceUser.objects.filter(
150
+ instance=instance.instance, at_home=True
151
+ ).exclude(is_active=False).exclude(instance.id)
152
+ if not users_at_home.count():
153
+ for ag in Component.objects.filter(
154
+ zone__instance=instance.instance,
155
+ base_type=AlarmGroup.base_type,
156
+ config__has_key='arm_on_away'
157
+ ).exclude(config__arm_on_away=None):
158
+ if ag.config.get('arm_on_away') == 'on_away':
159
+ ag.arm()
160
+ elif ag.config.get('arm_on_away').startswith('on_away_and_locked'):
161
+ locked_states = [
162
+ True if l['value'] == 'locked' else False
163
+ for l in Component.objects.filter(
164
+ base_type='lock', id__in=ag.config.get('arming_locks', []),
165
+ ).values('value')
166
+ ]
167
+ if not any(locked_states):
168
+ continue
169
+ if ag.config['arm_on_away'] == 'on_away_and_locked':
170
+ ag.arm()
171
+ continue
172
+ if ag.config['arm_on_away'] == 'on_away_and_locked_all' \
173
+ and all(locked_states):
174
+ ag.arm()
175
+ continue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: simo
3
- Version: 2.0.16
3
+ Version: 2.0.18
4
4
  Summary: Smart Home on Steroids!
5
5
  Author-email: Simanas Venčkauskas <simanas@simo.io>
6
6
  Project-URL: Homepage, https://simo.io
@@ -43,14 +43,14 @@ simo/core/gateways.py,sha256=s_c2W0v2_te89i6LS4Nj7F2wn9UwjZXPT7pfy6SToVo,3714
43
43
  simo/core/loggers.py,sha256=EBdq23gTQScVfQVH-xeP90-wII2DQFDjoROAW6ggUP4,1645
44
44
  simo/core/managers.py,sha256=WoQ4OX3akIvoroSYji-nLVqXBSJzCiC1u_IiWkKbKmA,2413
45
45
  simo/core/middleware.py,sha256=64PYjnyRnYf4sgMvPfR0oQqf9UEtxUwnhJe3RV6z_HI,2040
46
- simo/core/models.py,sha256=j5AymbJFt5HOIOYsHJ8UUKhb1TvIoqgH0T1y3BeGJuM,19408
46
+ simo/core/models.py,sha256=dPLPju4xxc46x9JciOTC65SFSPogboXyNxjwrewXB1Y,19400
47
47
  simo/core/permissions.py,sha256=UmFjGPDWtAUbaWxJsWORb2q6BREHqndv9mkSIpnmdLk,1379
48
48
  simo/core/routing.py,sha256=X1_IHxyA-_Q7hw1udDoviVP4_FSBDl8GYETTC2zWTbY,499
49
- simo/core/serializers.py,sha256=dY2R9KPvmmwMP4Up_6AHM6lf0MY3BoON8Dn8ixFubAI,17118
49
+ simo/core/serializers.py,sha256=HMSMOA5IcIYDIVipvuozf6bymJ-drvABPjEs-4lPjsI,17251
50
50
  simo/core/signal_receivers.py,sha256=EZ8NSYZxUgSaLS16YZdK7T__l8dl0joMRllOxx5PUt4,2809
51
51
  simo/core/socket_consumers.py,sha256=n7VE2Fvqt4iEAYLTRbTPOcI-7tszMAADu7gimBxB-Fg,9635
52
52
  simo/core/storage.py,sha256=YlxmdRs-zhShWtFKgpJ0qp2NDBuIkJGYC1OJzqkbttQ,572
53
- simo/core/tasks.py,sha256=se27V-noW02v4ZY2PMv0AJkXNsY3NtJ4G43__KLW7Kg,11005
53
+ simo/core/tasks.py,sha256=K64_8msFxUnggQDD2lBhtv4l7WliajQTlJNwe-m4BvY,10920
54
54
  simo/core/todos.py,sha256=eYVXfLGiapkxKK57XuviSNe3WsUYyIWZ0hgQJk7ThKo,665
55
55
  simo/core/types.py,sha256=WJEq48mIbFi_5Alt4wxWMGXxNxUTXqfQU5koH7wqHHI,1108
56
56
  simo/core/views.py,sha256=hlAKpAbCbqI3a-uL5tDp532T2oLFiF0MBzKUJ_SNzo0,5833
@@ -74,14 +74,14 @@ simo/core/__pycache__/gateways.cpython-38.pyc,sha256=XBiwMfBkjoQ2re6jvADJOwK0_0A
74
74
  simo/core/__pycache__/loggers.cpython-38.pyc,sha256=Z-cdQnC6XlIonPV4Sl4E52tP4NMEdPAiHK0cFaIL7I8,1623
75
75
  simo/core/__pycache__/managers.cpython-38.pyc,sha256=5vstOMfm997CZBBkaSiaS7EojhLTWZlbeA_EQ8u-yfg,2554
76
76
  simo/core/__pycache__/middleware.cpython-38.pyc,sha256=bGOFJNEhJeLbpsZp8LYn1VA3paLF5HULHQ6IFKa7Juc,2022
77
- simo/core/__pycache__/models.cpython-38.pyc,sha256=Gm36LWRxswvWiB3Wz0F7g32ZVXugh7chSSBz1lgBPZs,16995
77
+ simo/core/__pycache__/models.cpython-38.pyc,sha256=J3VZfFaU-aMkptCoviPvAJzJ8zBptGHmt504zjf2TCI,17006
78
78
  simo/core/__pycache__/permissions.cpython-38.pyc,sha256=uygjPbfRQiEzyo5-McCxsuMDJLbDYO_TLu55U7bJbR0,1809
79
79
  simo/core/__pycache__/routing.cpython-38.pyc,sha256=3T3FPJ8Cn99xZCGvMyg2xjl7al-Shm9CelbSpkJtNP8,599
80
- simo/core/__pycache__/serializers.cpython-38.pyc,sha256=07FzXZGZBEHlx1vboZThhU98WpmJDSbcQP3uYWNKMDw,16551
80
+ simo/core/__pycache__/serializers.cpython-38.pyc,sha256=YkAXdCwfPEysAQ5Nin9B48cZ5pK_2WZwyR5ZEwfJrC4,16666
81
81
  simo/core/__pycache__/signal_receivers.cpython-38.pyc,sha256=sgjH_wv-1U99auH5uHb3or0qettPeHAlsz8P7B03ajY,2430
82
82
  simo/core/__pycache__/socket_consumers.cpython-38.pyc,sha256=NJUr7nRyHFvmAumxxWpsod5wzVVZM99rCEuJs1utHA4,8432
83
83
  simo/core/__pycache__/storage.cpython-38.pyc,sha256=BTkYH8QQyjqI0WOtJC8fHNtgu0YA1vjqZclXjC2vCVI,1116
84
- simo/core/__pycache__/tasks.cpython-38.pyc,sha256=SyDXfBVyLfDnCcBYUVFDTMhmfB_frWyEQG6jQYcbyh4,8392
84
+ simo/core/__pycache__/tasks.cpython-38.pyc,sha256=9L1a14-cifiS4WSS7SliJ2486tpL245YbPkmUiCUe3A,8244
85
85
  simo/core/__pycache__/todos.cpython-38.pyc,sha256=lOqGZ58siHM3isoJV4r7sg8igrfE9fFd-jSfeBa0AQI,253
86
86
  simo/core/__pycache__/views.cpython-38.pyc,sha256=YrKRZPaV_JM4VGpdhVhsK-90UwUTOqp-V-Yj0SRGZgs,4212
87
87
  simo/core/__pycache__/widgets.cpython-38.pyc,sha256=sR0ZeHCHrhnNDBJuRrxp3zUsfBp0xrtF0xrK2TkQv1o,3520
@@ -10174,7 +10174,7 @@ simo/fleet/gateways.py,sha256=KV5i5fxXIrlK-k6zyEkk83x11GJt-ELQ0npb4Ac83cM,3693
10174
10174
  simo/fleet/managers.py,sha256=XOpDOA9L-f_550TNSyXnJbun2EmtGz1TenVTMlUSb8E,807
10175
10175
  simo/fleet/models.py,sha256=1Wb9xPc61OtoiYu9aS4KezchPGZTC4CDxa2dqVhltqM,14161
10176
10176
  simo/fleet/routing.py,sha256=cofGsVWXMfPDwsJ6HM88xxtRxHwERhJ48Xyxc8mxg5o,149
10177
- simo/fleet/serializers.py,sha256=zEpXAXxjk4Rf1JhlNnLTrs20qJggqjvIySbeHVo4Tt4,1505
10177
+ simo/fleet/serializers.py,sha256=LgSTnSI_sUhFXmW9-669keM6gmaSI_teaqMHEab4aL4,1972
10178
10178
  simo/fleet/socket_consumers.py,sha256=Z-MooNN2HQccdhkynADJks5slbK9mGsnEpMLuA51H3I,18534
10179
10179
  simo/fleet/tasks.py,sha256=AGq9BXFNAqkhOANsPvId8yjEbDtVCB3MRsi_AKDpgIM,821
10180
10180
  simo/fleet/utils.py,sha256=2gcjbwQawsGw2edr_wm9q6XacGpYqO-gd4BF1t0Hg6U,3511
@@ -10191,7 +10191,7 @@ simo/fleet/__pycache__/gateways.cpython-38.pyc,sha256=YAcgTOqJbtjGI03lvEcU6keFfr
10191
10191
  simo/fleet/__pycache__/managers.cpython-38.pyc,sha256=8uz-xpUiqbGDgXIZ_XRZtFb-Tju6NGxflGg-Ee4Yo6k,1310
10192
10192
  simo/fleet/__pycache__/models.cpython-38.pyc,sha256=DQtRR6kI9bt3atgJ0pArCVfSyuutqb6SpxYrsBg10cM,12277
10193
10193
  simo/fleet/__pycache__/routing.cpython-38.pyc,sha256=aPrCmxFKVyB8R8ZbJDwdPdFfvT7CvobovvZeq_mqRgY,314
10194
- simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=yuY2H7jcboQGZdjb5WIsgNHXFhI9IPMUrEu9NgSiXNo,2452
10194
+ simo/fleet/__pycache__/serializers.cpython-38.pyc,sha256=gwLIoLQJwkFoDCjKC_ikksNCYea3-mF8hVHFeKlOkbc,3098
10195
10195
  simo/fleet/__pycache__/socket_consumers.cpython-38.pyc,sha256=RjzPD580096fby0HYLzZorm61zdZNOq5AHXmNAC4Yd8,13764
10196
10196
  simo/fleet/__pycache__/tasks.cpython-38.pyc,sha256=RoNxL2WUiW67s9O9DjaYVVjCBSZu2nje0Qn9FJkWVS0,1116
10197
10197
  simo/fleet/__pycache__/utils.cpython-38.pyc,sha256=dTuvW9MnhUycwdCc6eHYfHsMlvZw-CmEWXWYu18X8Uw,1955
@@ -10270,18 +10270,18 @@ simo/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10270
10270
  simo/generic/app_widgets.py,sha256=E_pnpA1hxMIhenRCrHoQ5cik06jm2BAHCkl_eo-OudU,1264
10271
10271
  simo/generic/base_types.py,sha256=djymox_boXTHX1BTTCLXrCH7ED-uAsV_idhaDOc3OLI,409
10272
10272
  simo/generic/controllers.py,sha256=WYuOUzDWvkYRaTvlbdGy_qmwp1o_ohqKDfV7OrOq2QU,52218
10273
- simo/generic/forms.py,sha256=lrdGgOuFxizUu2l5PbW8CUiI0V_L8xHl2pN_kZB9238,23160
10273
+ simo/generic/forms.py,sha256=U6MIS5U7jLG6XabqCZvrfSoiNCQiWZYE8VZPnyN3SJw,23757
10274
10274
  simo/generic/gateways.py,sha256=b3tQ2bAkDVYXCF5iZi2yi-6nZAM8WmHE9ICwxMyR0to,17034
10275
- simo/generic/models.py,sha256=qRwZq92_suejbXSPTqbjIfICT0Y_ABywwYPa8DJ2V8A,5053
10275
+ simo/generic/models.py,sha256=iUE1-PVyAPvOkxczU6sXZKUwWVQxkljtx2E4g9WstnU,6711
10276
10276
  simo/generic/routing.py,sha256=elQVZmgnPiieEuti4sJ7zITk1hlRxpgbotcutJJgC60,228
10277
10277
  simo/generic/socket_consumers.py,sha256=NfTQGYtVAc864IoogZRxf_0xpDPM0eMCWn0SlKA5P7Y,1751
10278
10278
  simo/generic/__pycache__/__init__.cpython-38.pyc,sha256=mLu54WS9KIl-pHwVCBKpsDFIlOqml--JsOVzAUHg6cU,161
10279
10279
  simo/generic/__pycache__/app_widgets.cpython-38.pyc,sha256=0IoKRG9n1tkNRRkrqAeOQwWBPd_33u98JBcVtMVVCio,2374
10280
10280
  simo/generic/__pycache__/base_types.cpython-38.pyc,sha256=ptw6axyAqemZA35oa6vzr7EihzvbhW9w7Y-G6kfDedU,555
10281
10281
  simo/generic/__pycache__/controllers.cpython-38.pyc,sha256=e0bvgyePgJbIs1omBq0TRPlVSKar2sK_JbUKqDRj7mY,33235
10282
- simo/generic/__pycache__/forms.cpython-38.pyc,sha256=IOiN9D0NVn8e8OOieawG0QjSTZDcmFhGsf2i6oWaj5A,17430
10282
+ simo/generic/__pycache__/forms.cpython-38.pyc,sha256=lqpRTX5rnrkyJZ5Dga4e9y2WJ81r394AW5DV4KkvxXQ,17856
10283
10283
  simo/generic/__pycache__/gateways.cpython-38.pyc,sha256=a4lLIMPyxm9tNzIqorXHIPZFVTcXlPsM1ycJMghxcHA,12673
10284
- simo/generic/__pycache__/models.cpython-38.pyc,sha256=j4jKYVTM4XUfFzxIaRFhYx0oRSYzDRn8YVQyCteEhtc,3881
10284
+ simo/generic/__pycache__/models.cpython-38.pyc,sha256=GQeX2Y6diAiDKwd43RvSjRF3jGpkvXSu3ja7daEfQSA,5006
10285
10285
  simo/generic/__pycache__/routing.cpython-38.pyc,sha256=xtxTUTBTdivzFyA5Wh7k-hUj1WDO_FiRq6HYXdbr9Ks,382
10286
10286
  simo/generic/__pycache__/socket_consumers.cpython-38.pyc,sha256=piFHces0J9QuXu_CNBCQCYjoZEeoaxyVjLfJ9KaR8C8,1898
10287
10287
  simo/generic/static/weather_icons/01d@2x.png,sha256=TZfWi6Rfddb2P-oldWWcjUiuCHiU9Yrc5hyrQAhF26I,948
@@ -10446,8 +10446,8 @@ simo/users/templates/invitations/expired_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCe
10446
10446
  simo/users/templates/invitations/expired_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10447
10447
  simo/users/templates/invitations/taken_msg.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10448
10448
  simo/users/templates/invitations/taken_suggestion.html,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10449
- simo-2.0.16.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10450
- simo-2.0.16.dist-info/METADATA,sha256=toSBqhmwLzLJ7BNGd9_e0-YJpXhry91efsl9xGJn01M,1700
10451
- simo-2.0.16.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
10452
- simo-2.0.16.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10453
- simo-2.0.16.dist-info/RECORD,,
10449
+ simo-2.0.18.dist-info/LICENSE.md,sha256=M7wm1EmMGDtwPRdg7kW4d00h1uAXjKOT3HFScYQMeiE,34916
10450
+ simo-2.0.18.dist-info/METADATA,sha256=8siQqkBY_YIe8F8ZRhHunOOfyQmw3CZ9U2mZRLwXokk,1700
10451
+ simo-2.0.18.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
10452
+ simo-2.0.18.dist-info/top_level.txt,sha256=GmS1hrAbpVqn9OWZh6UX82eIOdRLgYA82RG9fe8v4Rs,5
10453
+ simo-2.0.18.dist-info/RECORD,,
File without changes