accrete 0.0.156__py3-none-any.whl → 0.0.158__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.
@@ -1,8 +1,11 @@
1
+ import json
2
+
1
3
  from django.db import models
2
4
  from django.db.models.query import RawQuerySet
3
- from django.forms import model_to_dict
4
5
 
5
6
  from .models import Log, LogConfig
7
+ from accrete.fields import TranslatedCharField, TranslatedTextField
8
+ from accrete.utils.models import model_to_dict
6
9
 
7
10
  TYPES_FK = ['AutoField', 'BigAutoField', 'ForeignKey']
8
11
  TYPES_INT = ['IntegerField', 'PositiveSmallIntegerField']
@@ -13,6 +16,7 @@ TYPES_BOOL = ['BooleanField']
13
16
  TYPES_DATETIME = ['DateTimeField']
14
17
  TYPES_DATE = ['DateField']
15
18
  TYPES_TIME = ['TimeField']
19
+ TYPES_JSON = ['JSONField']
16
20
 
17
21
 
18
22
  def internal_type_to_log_type(field: models.Field):
@@ -33,6 +37,8 @@ def internal_type_to_log_type(field: models.Field):
33
37
  return 'date'
34
38
  if internal_type in TYPES_DATETIME:
35
39
  return 'datetime'
40
+ if internal_type in TYPES_JSON:
41
+ return 'json'
36
42
 
37
43
 
38
44
  def log_state_to_dict(logs: RawQuerySet) -> tuple[dict, dict]:
@@ -71,9 +77,12 @@ def get_instance_state(instance: models.Model):
71
77
  fields_to_log = log_config.fields.all().values_list('field_name', flat=True)
72
78
 
73
79
  for f, v in state.items():
74
- if isinstance(v, (list, tuple, dict)):
80
+ if isinstance(v, (list, tuple)):
75
81
  continue
76
82
  if f not in fields_to_log:
77
83
  continue
84
+ if isinstance(v, dict) and isinstance(instance._meta.get_field(f), (TranslatedCharField, TranslatedTextField)):
85
+ cleaned_state.update({f: json.dumps(v)})
86
+ continue
78
87
  cleaned_state.update({f: v})
79
88
  return cleaned_state
@@ -0,0 +1,23 @@
1
+ # Generated by Django 5.2.7 on 2025-10-06 18:59
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('log', '0006_remove_log_accrete_log_model_cf888c_idx_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='log',
15
+ name='new_value_type',
16
+ field=models.CharField(choices=[('fk', 'Foreign Key'), ('int', 'Integer'), ('float', 'Float'), ('decimal', 'Decimal'), ('bool', 'Boolean'), ('str', 'String'), ('date', 'Date'), ('datetime', 'Date Time'), ('json', 'JSON')], max_length=100, verbose_name='New Value Type'),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='log',
20
+ name='old_value_type',
21
+ field=models.CharField(choices=[('fk', 'Foreign Key'), ('int', 'Integer'), ('float', 'Float'), ('decimal', 'Decimal'), ('bool', 'Boolean'), ('str', 'String'), ('date', 'Date'), ('datetime', 'Date Time'), ('json', 'JSON')], max_length=100, verbose_name='Old Value Type'),
22
+ ),
23
+ ]
@@ -63,7 +63,8 @@ class Log(models.Model):
63
63
  ('bool', 'Boolean'),
64
64
  ('str', 'String'),
65
65
  ('date', 'Date'),
66
- ('datetime', 'Date Time')
66
+ ('datetime', 'Date Time'),
67
+ ('json', 'JSON')
67
68
  ],
68
69
  max_length=100,
69
70
  )
@@ -78,7 +79,8 @@ class Log(models.Model):
78
79
  ('bool', 'Boolean'),
79
80
  ('str', 'String'),
80
81
  ('date', 'Date'),
81
- ('datetime', 'Date Time')
82
+ ('datetime', 'Date Time'),
83
+ ('json', 'JSON')
82
84
  ],
83
85
  max_length=100
84
86
  )
@@ -5,7 +5,7 @@ from accrete.tenant import get_tenant
5
5
  from .models import Sequence
6
6
 
7
7
 
8
- def get_nextval(name, create_if_none=True):
8
+ def get_nextval(name: str, create_if_none:bool = True) -> int:
9
9
  tenant = get_tenant()
10
10
  with transaction.atomic():
11
11
  seq = Sequence.objects.filter(
@@ -16,5 +16,6 @@ from .response import (
16
16
  message_response,
17
17
  add_trigger,
18
18
  update,
19
- WindowResponseConfig
19
+ WindowResponseConfig,
20
+ redirect_response
20
21
  )
@@ -465,3 +465,10 @@ def update(request, ui_responses: list[Response], trigger: list[ClientTrigger] =
465
465
  for t in trigger or []:
466
466
  add_trigger(response, t.trigger, t.header)
467
467
  return response
468
+
469
+
470
+ def redirect_response(url: str, reload: bool = True):
471
+ res = HttpResponse()
472
+ header = 'HX-Redirect' if reload else 'HX-Location'
473
+ res[header] = url
474
+ return res
@@ -0,0 +1,5 @@
1
+ {% with id=widget.attrs.id %}<div{% if id %} id="{{ id }}"{% endif %}{% if widget.attrs.class %} class="{{ widget.attrs.class }}"{% endif %}>{% for group, options, index in widget.optgroups %}{% if group %}
2
+ <div><label class="has-text-weight-medium">{{ group }}</label>{% endif %}<div style="display: flex; flex-direction: row; flex-wrap: wrap">{% for option in options %}<div class="mr-2" style="white-space: nowrap">
3
+ {% include option.template_name with widget=option %}</div>{% endfor %}</div>{% if group %}
4
+ </div>{% endif %}{% endfor %}
5
+ </div>{% endwith %}
@@ -1,11 +1,13 @@
1
1
  {% load i18n %}
2
2
 
3
3
  {% if form.non_field_errors or form.save_error %}
4
- <div class="notification is-danger is-light" style="word-wrap: break-word;">
5
- {{ form.non_field_errors }}
6
- {% if form.save_error %}
7
- <p>{{ form.save_error }}</p>
8
- {% if form.save_error_id %}<span>{% translate 'Error ID' %}: {{ form.save_error_id }}</span>{% endif %}
9
- {% endif %}
4
+ <div class="message is-danger" style="word-wrap: break-word;">
5
+ <div class="message-body">
6
+ {{ form.non_field_errors }}
7
+ {% if form.save_error %}
8
+ <p>{{ form.save_error }}</p>
9
+ {% if form.save_error_id %}<span>{% translate 'Error ID' %}: {{ form.save_error_id }}</span>{% endif %}
10
+ {% endif %}
11
+ </div>
10
12
  </div>
11
13
  {% endif %}
@@ -146,7 +146,7 @@
146
146
  <div id="message" class="" style="position: fixed; top: calc(var(--bulma-navbar-height) + 5px); left: 50%; transform: translateX(-50%); z-index: 999">
147
147
  {% for message in messages %}
148
148
  <div class="mb-2" style="min-width: 330px; max-width: 330px" x-data="{ show: false }" x-show="show" x-cloak="" x-init="show = true; setTimeout(() => show = false, 4000)" x-transition.duration.200ms>
149
- <article class="message {{ message|message_class }}" style="box-shadow: 2px 2px 5px">
149
+ <article class="message {{ message|message_class }}">
150
150
  <div class="message-body">
151
151
  {{ message }}
152
152
  <button class="delete" x-on:click="show = false;" style="position: absolute; top: 5px; right: 5px"></button>
@@ -7,7 +7,7 @@
7
7
  <div id="list-grid" class="grid m-0">
8
8
  {% for instance in page.object_list %}
9
9
  {% partialdef entry inline=True %}
10
- <div id="list-entry-{{ instance.pk }}" class="list-entry cell pb-0" style="{% if column_height %}min-height: {{ column_height }}{% endif %}">
10
+ <div id="list-entry-{{ instance.pk }}" class="list-entry cell pb-0" style="{% if column_height %}height: {{ column_height }}{% endif %}">
11
11
  <div class="box p-3"
12
12
  style="word-break: break-word; height: 100%; overflow-y: auto; {% if instance.get_absolute_url and detail_enabled %}cursor:pointer;{% endif %}"
13
13
  {% if instance.get_absolute_url and detail_enabled %}
@@ -4,7 +4,7 @@
4
4
  {% for message in messages %}
5
5
  <div hx-swap-oob="{% if append %}beforeend:#message{% else %}innerHTML:#message{% endif %}">
6
6
  <div class="mb-2" style="min-width: 340px; max-width: 340px" x-data="{ show: false }" x-show="show" x-cloak="" x-init="show = true; {% if not persistent %}setTimeout(() => show = false, 4000){% endif %}" x-transition.duration.200ms>
7
- <article class="message {{ message|message_class }}" style="box-shadow: 2px 2px 5px">
7
+ <article class="message {{ message|message_class }}">
8
8
  <div class="message-body">
9
9
  {{ message }}
10
10
  <button class="delete" x-on:click="show = false;" style="position: absolute; top: 5px; right: 5px"></button>
@@ -1,28 +1,9 @@
1
1
  {% load ui %}
2
2
  {% load partials %}
3
3
 
4
- {#{% partialdef form_field %}#}
5
- {# <label class="label mt-2 mb-5">#}
6
- {# {{ field.label }}#}
7
- {# {{ field }}#}
8
- {# <span class="has-text-danger is-size-6">{{ field.errors }}</span>#}
9
- {# <span class="helptext is-size-7">{{ field.help_text }}</span>#}
10
- {# <span class="helptext is-size-7">{% if label %}{{ label }}{% else %}{{ field.help_text|default_if_falsy:field.label }}{% endif %}</span>#}
11
- {# </label>#}
12
- {#{% endpartialdef %}#}
13
-
14
- {#{% partialdef form_field %}#}
15
- {# <label class="label mt-2 mb-5" style="border: 1px solid; border-radius: var(--bulma-radius);">#}
16
- {# <span style="justify-content: left" class="is-fullwidth button is-static helptext is-size-7 {% if field.field.required %}has-text-weight-bold{% endif %}">{% if label %}{{ label }}{% else %}{{ field.help_text|default_if_falsy:field.label }}{% endif %}</span>#}
17
- {# {{ field }}#}
18
- {# <span class="has-text-danger is-size-6">{{ field.errors }}Testmessage</span>#}
19
- {##}
20
- {# </label>#}
21
- {#{% endpartialdef %}#}
22
-
23
4
  {% partialdef form_field %}
24
5
  <div class="mb-5">
25
- <label class="label mb-0 {% if field.field.required %}has-text-weight-medium{% endif %}" for="{{ field.id_for_label }}">{{ field.label }}</label>
6
+ <label class="label mb-0 {% if field.field.required %}has-text-weight-bold{% endif %}" for="{{ field.id_for_label }}">{{ field.label }}</label>
26
7
  <div class="field has-addons mb-0">
27
8
  {% if icon %}
28
9
  <p class="control">
@@ -36,6 +17,24 @@
36
17
  </div>
37
18
  {% endpartialdef %}
38
19
 
20
+ {% partialdef form_checkbox %}
21
+ <div class="mb-5">
22
+ <div class="level" style="display: flex; flex-direction: row; justify-content: start">
23
+ <div class="field has-addons mb-0">
24
+ {% if icon %}
25
+ <p class="control">
26
+ <button tabindex="-1" type="button" class="button is-static"><span class="icon"><i class="{{ icon }}"></i></span></button>
27
+ </p>
28
+ {% endif %}
29
+ <div class="control is-expanded">{{ field }}</div>
30
+ </div>
31
+ <label class="label mb-0 {% if field.field.required %}has-text-weight-bold{% endif %}" for="{{ field.id_for_label }}">{{ field.label }}</label>
32
+ </div>
33
+ <span class="has-text-danger is-size-6">{{ field.errors }}</span>
34
+ <span class="helptext is-size-7">{{ field.help_text|default_if_falsy:'' }}</span>
35
+ </div>
36
+ {% endpartialdef %}
37
+
39
38
  {% partialdef textarea %}
40
39
  <label class="label mt-2 mb-5">
41
40
  <span class="{% if field.field.required %}has-text-weight-normal{% endif %}">{{ field.label }}</span>
@@ -45,12 +44,6 @@
45
44
  {% endpartialdef %}
46
45
 
47
46
  {% partialdef model_field %}
48
- {# <label class="label mt-2 mb-5">#}
49
- {# <span class="field has-addons mb-0">#}
50
- {# <span class="control input has-text-weight-bold">{{ value|default_if_none:'' }}</span>#}
51
- {# </span>#}
52
- {# <span class="helptext">{{ label }}</span>#}
53
- {# </label>#}
54
47
  <div class="mb-5">
55
48
  <label class="label mb-0 {% if field.field.required %}has-text-weight-bold{% endif %}" for="{{ field.id_for_label }}">{{ label }}</label>
56
49
  <div class="field has-addons mb-0">
@@ -2,12 +2,12 @@
2
2
  {{ tenant.name }}
3
3
  </div>
4
4
  {% if tenants and switch_url %}
5
- <article class="p-1 has-text-weight-bold" style="background-color: var(--bulma-body-background-color); position: fixed; top: var(--bulma-navbar-height); left: 0; box-shadow: 2px 2px 5px; border-bottom-right-radius: var(--bulma-radius); min-width: 150px;"
5
+ <article class="box p-1" style="position: fixed; top: var(--bulma-navbar-height); left: 0; min-width: 150px; border-top-left-radius: 0; border-top-right-radius: 0;"
6
6
  x-show="showQuickSwitch" x-cloak="" x-on:click.outside="showQuickSwitch = false"
7
7
  >
8
8
  <ul class="hoverable mr-1">
9
9
  {% for t in tenants %}
10
- <li class="title is-6 mb-1 p-2" style="cursor: pointer; border-radius: var(--bulma-radius);"><a href="{{ switch_url }}?tenant_id={{ t.pk }}" hx-boost="false" style="width: 100%; display: inline-block">{{ t.name }}</a></li>
10
+ <li class="navbar-item" style="cursor: pointer; border-radius: var(--bulma-radius);"><a href="{{ switch_url }}?tenant_id={{ t.pk }}" hx-boost="false" style="width: 100%; display: inline-block">{{ t.name }}</a></li>
11
11
  {% endfor %}
12
12
  </ul>
13
13
  </article>
@@ -163,13 +163,19 @@ def x_ref_save(param: str):
163
163
 
164
164
 
165
165
  @register.filter(name='wrap_form_field')
166
- def wrap_form_fields(field, icon=None):
166
+ def wrap_form_field(field, icon=None):
167
167
  if isinstance(field.field.widget, widgets.Textarea):
168
168
  html = render_to_string(
169
169
  'ui/templatetags/field.html#textarea',
170
170
  {'field': field, 'icon': None}
171
171
  )
172
172
  return mark_safe(html)
173
+ if isinstance(field.field.widget, widgets.CheckboxInput):
174
+ html = render_to_string(
175
+ 'ui/templatetags/field.html#form_checkbox',
176
+ {'field': field, 'icon': None}
177
+ )
178
+ return mark_safe(html)
173
179
  html = render_to_string(
174
180
  'ui/templatetags/field.html#form_field',
175
181
  {'field': field, 'icon': icon}
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.7 on 2025-10-08 18:11
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('user', '0010_alter_user_theme'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='user',
15
+ name='theme',
16
+ field=models.CharField(choices=[(None, [('preset', 'Preset'), ('light', 'Light'), ('dark', 'Dark'), ('custom', 'Custom')])], default='preset', max_length=50, verbose_name='Theme'),
17
+ ),
18
+ ]
@@ -181,10 +181,12 @@ class User(AbstractBaseUser, PermissionsMixin):
181
181
  verbose_name=_('Theme'),
182
182
  max_length=50,
183
183
  choices=[
184
- ('preset', _('Preset')),
185
- ('light', _('Light')),
186
- ('dark', _('Dark')),
187
- ('custom', _('Custom'))
184
+ (None, (
185
+ ('preset', _('Preset')),
186
+ ('light', _('Light')),
187
+ ('dark', _('Dark')),
188
+ ('custom', _('Custom'))
189
+ ))
188
190
  ],
189
191
  default='preset'
190
192
  )
accrete/utils/models.py CHANGED
@@ -1,6 +1,9 @@
1
1
  import json
2
2
  from django.db import connection
3
3
  from django.db.models import Model, Field
4
+ from django.forms import model_to_dict as mtd
5
+
6
+ from accrete.fields import TranslatedCharField, TranslatedTextField
4
7
 
5
8
 
6
9
  def get_related_model(model: type[Model], rel_path: str) -> tuple[Model, list[str]]:
@@ -43,3 +46,19 @@ def translated_db_value(instance: Model, field: str) -> dict:
43
46
  row = row and row[0]
44
47
  db_value = row and json.loads(row) or dict()
45
48
  return db_value
49
+
50
+
51
+ def model_to_dict(instance, fields=None, exclude=None, translated=True):
52
+ """
53
+ Extends django.forms.model_to_dict with the option to get the
54
+ translation dict instead of the translated string for the active language
55
+ """
56
+ data = mtd(instance, fields=fields, exclude=exclude)
57
+ if translated:
58
+ return data
59
+ updates = {}
60
+ for f, v in data.items():
61
+ if isinstance(instance._meta.get_field(f), (TranslatedCharField, TranslatedTextField)):
62
+ updates.update({f: translated_db_value(instance, f)})
63
+ data.update(updates)
64
+ return data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: accrete
3
- Version: 0.0.156
3
+ Version: 0.0.158
4
4
  Summary: Django Shared Schema Multi Tenant
5
5
  Author-email: Benedikt Jilek <benedikt.jilek@pm.me>
6
6
  License: Copyright (c) 2025 Benedikt Jilek
@@ -28,8 +28,8 @@ accrete/contrib/log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
28
28
  accrete/contrib/log/admin.py,sha256=iUNGFJJLFlCxvampt-LYDOrMu_fffNY2Vo4m1m5aQlM,799
29
29
  accrete/contrib/log/apps.py,sha256=O0Cje3MmpxPToJVgO195lBg0tRCy9Ou87-ntcdGBKM0,369
30
30
  accrete/contrib/log/config.py,sha256=vRzPVbiUfpo5NGtgiJv5mEKR_h3qsYI_brxjni6-Z-Y,132
31
- accrete/contrib/log/helper.py,sha256=n5QXPf4Lo8NvxDaJifZs4QVNJdiNyr17e_z26QT9V-U,2514
32
- accrete/contrib/log/models.py,sha256=bNhfYgz8czZNGDroOA-xvuM-Ad96gQ1C1475EIWPtFg,6276
31
+ accrete/contrib/log/helper.py,sha256=YgWJTJw0B-xlZWbEguejaIssg_AUYajUJZ3v1rVU_mA,2876
32
+ accrete/contrib/log/models.py,sha256=ded6_Mk6fXU82Is6chwmajMfcmPcVuBF5r9iWDCoSfU,6336
33
33
  accrete/contrib/log/queries.py,sha256=IsdzgcKkCeKE8pOa7zOFuaHcJUGG0wyr8EG1CrRrZRw,1189
34
34
  accrete/contrib/log/signals.py,sha256=q4ZjAoPBCWXnn--a42J9NKzU3cfadjNBdjoGcBLjfus,2147
35
35
  accrete/contrib/log/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
@@ -40,13 +40,14 @@ accrete/contrib/log/migrations/0003_alter_log_tenant.py,sha256=yp3WizRdAPvPctMiC
40
40
  accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py,sha256=iXD3kDj8GAD5Dce9xVozl0n8KCQaK4LsQkLHR3BDZ28,2367
41
41
  accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py,sha256=eN0AG2vR80-9NvMBfijjM04qPfRGxO7B8VFabrEZ_ZQ,1127
42
42
  accrete/contrib/log/migrations/0006_remove_log_accrete_log_model_cf888c_idx_and_more.py,sha256=K4gA_MrunNpKdvMZFq7CDsAQvnRqBiHspHlgI1ZYO6M,708
43
+ accrete/contrib/log/migrations/0007_alter_log_new_value_type_alter_log_old_value_type.py,sha256=Ekp5XLmIqWtR4hKhi3XVvlASd9VN41eOCdlvl3yKoMY,1039
43
44
  accrete/contrib/log/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
45
  accrete/contrib/sequence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
46
  accrete/contrib/sequence/admin.py,sha256=mTjab5cVklRUIQcSrsUo-_JgtXEsSdcFj_gfWhlStS4,273
46
47
  accrete/contrib/sequence/apps.py,sha256=2SalOz9piCrbOPudCh0grN1eojN9kEC4-jcNzBmfqEk,164
47
48
  accrete/contrib/sequence/forms.py,sha256=cdjLIytH7WlJK-B2Y6xRRPjOijkK36XpqUuIe4yLLj0,248
48
49
  accrete/contrib/sequence/models.py,sha256=UEuPvg1StovPW1n9yF-f31nBq4aTj5zpfS10oqcf60E,887
49
- accrete/contrib/sequence/queries.py,sha256=VT4pbYKzVAEE_8oPOaavdcCPi-zPiX1BwdVviWh8XKM,683
50
+ accrete/contrib/sequence/queries.py,sha256=6BI2VGerXkeblZleII8Z2hsLOgzlSguvPGa3VNUSTC4,702
50
51
  accrete/contrib/sequence/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
51
52
  accrete/contrib/sequence/views.py,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63
52
53
  accrete/contrib/sequence/migrations/0001_initial.py,sha256=iAR_hhGN2wDAk40IS9PwEsm7iYqfgasoKRrTLFEpOY8,1352
@@ -63,7 +64,7 @@ accrete/contrib/system_mail/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2
63
64
  accrete/contrib/system_mail/views.py,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63
64
65
  accrete/contrib/system_mail/migrations/0001_initial.py,sha256=6cwkkRXGjXvwXoMjjgmWmcPyXSTlUbhW1vMiHObk9MQ,1074
65
66
  accrete/contrib/system_mail/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
- accrete/contrib/ui/__init__.py,sha256=MNeG4PxPZIY_mc_AbxgnrX07OdYvSQCGX8jL1qTQ0t4,391
67
+ accrete/contrib/ui/__init__.py,sha256=xR7k0S_0yXYNVHPy41BrbAUrpM0EHHBSDWqw1bVmFqo,414
67
68
  accrete/contrib/ui/admin.py,sha256=MKShWrFexu9_k-lcCAwn1i1SlKqFV2ScCLo_pU5dX4E,245
68
69
  accrete/contrib/ui/apps.py,sha256=E0ao2ox6PQ3ldfeR17FXJUUJuGiWjm2DPCxHbPXGzls,152
69
70
  accrete/contrib/ui/config.py,sha256=g2nvcsFq9aTleauTRUbV7TJGQ5I6xId-LpeSgoWNIXI,192
@@ -71,7 +72,7 @@ accrete/contrib/ui/filter.py,sha256=MZfy6p4Q6TVvtjl5nF7_6CemOe1twbk0Bj5LWptjcwM,
71
72
  accrete/contrib/ui/forms.py,sha256=Ul3daXNwWLN1G3ppwOvNztrilIAGeLwNY1a-g-njrjQ,2049
72
73
  accrete/contrib/ui/middleware.py,sha256=fVjKeDXnGiJw7NRYZK3nCkj7g-MAainiBl-VhpE3XdQ,1792
73
74
  accrete/contrib/ui/models.py,sha256=ikwd7vHuq0R_qcr_gczcHHRvkXwr-zJMrfrriIUJD7U,3426
74
- accrete/contrib/ui/response.py,sha256=0wkGpn6XJQRBDA6AYJKtnkTx_jzkJXqrLWE4i6RHVKQ,14635
75
+ accrete/contrib/ui/response.py,sha256=q6V6vSHbioUYbkIUtYbRidmbryTE84Qb9Nu4oZetwJ8,14809
75
76
  accrete/contrib/ui/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
76
77
  accrete/contrib/ui/urls.py,sha256=5XUfK85HYWYf7oopMoJEEYmQ6pNgHgZBErBEn97pBt4,337
77
78
  accrete/contrib/ui/views.py,sha256=foVB7rx3_FWU9fkPdUKiqkVsWraAyfenC2OTNyYt7lI,4644
@@ -203,6 +204,7 @@ accrete/contrib/ui/templates/django/forms/widgets/date.html,sha256=s-YWfQ8b2w2fR
203
204
  accrete/contrib/ui/templates/django/forms/widgets/email.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48
204
205
  accrete/contrib/ui/templates/django/forms/widgets/file.html,sha256=J1NmXmQTp6IU48K-zRdLeYl-1Tpavx6ZAo3cPIP9Y6Y,755
205
206
  accrete/contrib/ui/templates/django/forms/widgets/input.html,sha256=JlH6iRxq5GvD3PQzrC1Z1SgqLmya4KDDuF7MqrVdhcY,295
207
+ accrete/contrib/ui/templates/django/forms/widgets/radio.html,sha256=rZ1r8qzBoYhI7ft1tiM9uXqFzFGeR8vQ4yV-XQ3q_G8,572
206
208
  accrete/contrib/ui/templates/django/forms/widgets/select.html,sha256=uSfDpOQox2mEKDm9LWJ6jg5rCa3jCbHHTcmOadFLlBg,455
207
209
  accrete/contrib/ui/templates/django/forms/widgets/text.html,sha256=MSmLlQc7PsPoDLVtTOOiWNprrsPriNr712yFxaHyDIo,47
208
210
  accrete/contrib/ui/templates/django/forms/widgets/textarea.html,sha256=c9BTedqb3IkXLyVYd0p9pR8DFnsXCNGoxVBWZTk_Fic,278
@@ -211,11 +213,11 @@ accrete/contrib/ui/templates/ui/content_right.html,sha256=aOFjbtXjjlqwmHpGoEpAUz
211
213
  accrete/contrib/ui/templates/ui/custom_theme.html,sha256=son43yhp-7ROTpRU9SY3pSgxXDdFiuHa1ThkCG8bnwk,695
212
214
  accrete/contrib/ui/templates/ui/detail.html,sha256=V0HccLE0Pb-5haQFpvIoWZfF1UOrvMwPYv2UTwRnt_A,293
213
215
  accrete/contrib/ui/templates/ui/favicon.html,sha256=ZSK6qDGV4Cexgt0VA3KOHYN100yZHOFjfOiFZVudWg0,90
214
- accrete/contrib/ui/templates/ui/form_error.html,sha256=WWqfFWyJ_LCzm5IkxXztn23GFak5wyM2HZcmiZ3Eq9s,417
215
- accrete/contrib/ui/templates/ui/layout.html,sha256=2Geugdxea9Qw8LFsePg9-BE4NtpeI3Ems1WarpyqC2A,15020
216
- accrete/contrib/ui/templates/ui/list.html,sha256=jzxklYBF_oDLKvXxYe-h3x2r5PK04A8flWnZ5-qZ4rM,2392
216
+ accrete/contrib/ui/templates/ui/form_error.html,sha256=xIBoM45w_KQWrLDmXh4vibXz5w2_VEYrRCFrAEqdAl0,473
217
+ accrete/contrib/ui/templates/ui/layout.html,sha256=JjIDwzsJkXvq8jtgf-7ZMUv17jS_gRhIvow-LolfX3E,14988
218
+ accrete/contrib/ui/templates/ui/list.html,sha256=CcVQBxRmBZWFbTI9Lq0S_myIBB-bJpIIi9dHoDUwnJ4,2388
217
219
  accrete/contrib/ui/templates/ui/list_update.html,sha256=CUV-OJCieOBrtSbh0vAoyZYL-_e9lP7vQrY4j1TlT7M,276
218
- accrete/contrib/ui/templates/ui/message.html,sha256=BGF00gdPSCGrWoZBi6d7U-ohNkDuF0ODKp4_fy0jtTU,856
220
+ accrete/contrib/ui/templates/ui/message.html,sha256=H0JC3qoLO-M6vb9TcEPY-TNGHtgqcG5yOxSUP2sSb7g,824
219
221
  accrete/contrib/ui/templates/ui/modal.html,sha256=sJI7YwTHPvirNlig69A08z7sk_5aYRmyeAUWzm1ceVs,3464
220
222
  accrete/contrib/ui/templates/ui/oob.html,sha256=lZHIBBYclefbGkKguS1A7vrtOhODJizbSRaGAAHDvG8,267
221
223
  accrete/contrib/ui/templates/ui/table.html,sha256=ATxvStGMsc0Fz4FkUD2xZs_xhbY1-Zn1zGTrBE_w62s,3792
@@ -225,14 +227,14 @@ accrete/contrib/ui/templates/ui/filter/query_input.html,sha256=OYXO0l5kVOvsnOYUs
225
227
  accrete/contrib/ui/templates/ui/filter/query_operator.html,sha256=h4WWLDnse6DK5Rb_0TTb0wqWxhvY_g3qjwx8_eENMuI,569
226
228
  accrete/contrib/ui/templates/ui/filter/query_params.html,sha256=9Kyb-dQRitjeruIEx1HJUI0elznb0KSV5fJR6keWi_4,9994
227
229
  accrete/contrib/ui/templates/ui/filter/query_tags.html,sha256=ooeIwIwvhT0fG5SMAuLoMquTVUmYf5n50DM-3gC_iAo,1567
228
- accrete/contrib/ui/templates/ui/templatetags/field.html,sha256=3wkjN-OJ6Em0_xskDWak9gpOVbNaXGU3RAMsxBwPH-8,3141
229
- accrete/contrib/ui/templates/ui/templatetags/tenant_quick_switch.html,sha256=5AZ_asMZ5gX7gM3_qD65EXxC9kuTRJLUmNcx4RzHi6Y,926
230
+ accrete/contrib/ui/templates/ui/templatetags/field.html,sha256=p0h2213KOx3lB3hrHvjeFC-KPE9NF81jihVKkeC83Lg,2710
231
+ accrete/contrib/ui/templates/ui/templatetags/tenant_quick_switch.html,sha256=Vqp4fdv0jKp5cAP4ruH9a70BwRGSXfYu2NEotl6IJIU,828
230
232
  accrete/contrib/ui/templates/ui/widgets/date_weekday.html,sha256=l5k7lFJjdao49Q6oyGf20go-bXJFlidTuUVKYOuISGE,628
231
233
  accrete/contrib/ui/templates/ui/widgets/model_search_select.html,sha256=Pv28g0CRBTeW--v9LoP39NDDc18RGEC8Hu9MAN-Tsi0,2996
232
234
  accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html,sha256=stEhZXCvaj8jjRTg1chwQmyWPeseQaDrLPr257vNtGo,4697
233
235
  accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html,sha256=4Wky0XkYWZlIKXTXzGjJkJTX3H9rhjXTY1hYai3Q3TA,242
234
236
  accrete/contrib/ui/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
235
- accrete/contrib/ui/templatetags/ui.py,sha256=7KmBsQ-q9poHSs2EC5pkkMC-pp9b-kj3RMymggZ4UGM,7461
237
+ accrete/contrib/ui/templatetags/ui.py,sha256=pgg9BRlPS0ogsFEl-4DjLhSeE3ThaRWMmbpyv9xm7sQ,7695
236
238
  accrete/contrib/ui/widgets/__init__.py,sha256=2mcvXyFNdFkqOVHGUBDbLmbaJnWnoFaS1uc4dqmdtpE,106
237
239
  accrete/contrib/ui/widgets/date_weekday.py,sha256=r6VNE8dwGVZq4jJLGF_MP320-yp482Iykh-WsjeY9XU,148
238
240
  accrete/contrib/ui/widgets/search_select.py,sha256=CnWQp2JpzjNJy9arG_sFWoRvVs29x9OzdgULm7yh7d0,3745
@@ -242,7 +244,7 @@ accrete/contrib/user/apps.py,sha256=oHDrAiHf-G57mZLyxqGJzRY2DbPprGFD-QgyVJG_ruI,
242
244
  accrete/contrib/user/auth_backends.py,sha256=doGdxil4fjhgY5oC2s8zueQq-bQsZ1fyiAo46HyBHLk,598
243
245
  accrete/contrib/user/forms.py,sha256=aryAdsBmOw9sUE2xd7A3CKPPvZd_2pKilbtdEO3J-D0,3295
244
246
  accrete/contrib/user/middleware.py,sha256=qblcujwJsthopagyT-hPFq4HsMyGt-VvqZw5TQopBjk,403
245
- accrete/contrib/user/models.py,sha256=TDED3rTF_5H6u65As6h94DrptW7wMJjUUzuvVkNedR0,6338
247
+ accrete/contrib/user/models.py,sha256=pz4bfiNmk45Ld2TT1rrJInhNrqYqesz7IRnfQjm8oRI,6390
246
248
  accrete/contrib/user/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
247
249
  accrete/contrib/user/urls.py,sha256=_fBa--3NfyYN10Td7PGHpetJYy42SMqTyCCXhgynkEQ,407
248
250
  accrete/contrib/user/views.py,sha256=u0lJ3ZWMKpgcx8iF8W0LVGP2Cu4VtkIdEiuko2rBBms,4257
@@ -258,6 +260,7 @@ accrete/contrib/user/migrations/0007_user_managed_login.py,sha256=SfG1Yj9m_g-sZb
258
260
  accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py,sha256=XypG6tN0WmLyJV8sbZgSVqNFbTxRsBHWhIRyMJGfV7c,655
259
261
  accrete/contrib/user/migrations/0009_alter_user_theme.py,sha256=o5s0NCEhauE72Z35q3ggsy3-L8PhFmRnQ2x4dlR1aQE,517
260
262
  accrete/contrib/user/migrations/0010_alter_user_theme.py,sha256=l2raJRmLErPCBqep9-v7kor4jzmG27wAT0ZWTwkFTk0,510
263
+ accrete/contrib/user/migrations/0011_alter_user_theme.py,sha256=LzosJbgzGRWgiYGytM220OFrLN6RS0yPdH00o8eI0B8,520
261
264
  accrete/contrib/user/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
262
265
  accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html,sha256=kp0_IGY3aRXktrlauruW0ciF84rpR0VzI0PUw7rzSag,351
263
266
  accrete/contrib/user/templates/user/change_email.html,sha256=frkoUCUwNtVSe9fhxmFmiM8T3RaFzLKOpAv5gZ7F-AY,473
@@ -293,9 +296,9 @@ accrete/utils/__init__.py,sha256=ZqTvAA625k3NVZHXb4PpPOVAIV3gUESfCe6Ad2f1wuM,361
293
296
  accrete/utils/dates.py,sha256=apM6kt6JhGrKgoT0jfav1W-8AUVTxNc9xt3fJQ2n0JI,1492
294
297
  accrete/utils/forms.py,sha256=naV4urdfvmpxcx5Vf3Fo72M5Fy8DjGg5-vkysMKptbA,3914
295
298
  accrete/utils/log.py,sha256=BH0MBDweAjx30wGBO4F3sFhbgkSoEs7T1lLLjlYZNnA,407
296
- accrete/utils/models.py,sha256=0uDhiWl7G2MDnbdYcAdKaIArw-NFMSwRArCcZ0FrZSk,1509
299
+ accrete/utils/models.py,sha256=o_nvvwXf8L9hg_6mkFmC9ok7eFZ0auZ0kUC7Buw7du8,2205
297
300
  accrete/utils/views.py,sha256=LE9pZ1x9f7ioaPYydbrN4t1b0o6NIIq0qUjPTb1Qkbw,5022
298
- accrete-0.0.156.dist-info/METADATA,sha256=z9JgzV9JvLMWct6-DAXIuoBqTW0K11cYAnq6SuY_V_g,4953
299
- accrete-0.0.156.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
300
- accrete-0.0.156.dist-info/licenses/LICENSE,sha256=vHwb4Qnv8UfYKFiCWyTuRGsi49x19UQwHRCky3b2_NE,1057
301
- accrete-0.0.156.dist-info/RECORD,,
301
+ accrete-0.0.158.dist-info/METADATA,sha256=osIV2xm1eTG6dC3XwXWe5WoizG5DbJALcQBaIvPOgo8,4953
302
+ accrete-0.0.158.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
303
+ accrete-0.0.158.dist-info/licenses/LICENSE,sha256=vHwb4Qnv8UfYKFiCWyTuRGsi49x19UQwHRCky3b2_NE,1057
304
+ accrete-0.0.158.dist-info/RECORD,,