accrete 0.0.155__py3-none-any.whl → 0.0.157__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,21 +1,6 @@
1
- import django.apps
2
1
  from django.contrib import admin
3
- from django import forms
4
2
  from . import models
5
3
 
6
- installed_models = django.apps.apps.get_models(
7
- include_auto_created=True, include_swapped=True
8
- )
9
- model_choices = [(
10
- f'{m._meta.app_label}.{m._meta.model_name}',
11
- f'{m._meta.app_label}.{m._meta.verbose_name}'
12
- ) for m in installed_models]
13
-
14
-
15
- class LogConfigForm(forms.ModelForm):
16
-
17
- model = forms.ChoiceField(choices=model_choices)
18
-
19
4
 
20
5
  class LogConfigFieldInLine(admin.TabularInline):
21
6
 
@@ -28,7 +13,6 @@ class LogConfigAdmin(admin.ModelAdmin):
28
13
  list_display = ('model', 'ignore_errors', 'exclude_fields')
29
14
  search_fields = ('pk', 'model')
30
15
  list_filter = ['ignore_errors', 'exclude_fields']
31
- form = LogConfigForm
32
16
  inlines = [LogConfigFieldInLine]
33
17
 
34
18
 
@@ -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,24 @@
1
+ # Generated by Django 5.2.7 on 2025-10-05 21:45
2
+
3
+ from django.conf import settings
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('accrete', '0010_alter_accessgroup_description'),
11
+ ('log', '0005_logconfig_exclude_fields_and_more'),
12
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.RemoveIndex(
17
+ model_name='log',
18
+ name='accrete_log_model_cf888c_idx',
19
+ ),
20
+ migrations.AddIndex(
21
+ model_name='log',
22
+ index=models.Index(fields=['model', 'object_id', 'tenant_id'], name='accrete_log_model_22d992_idx'),
23
+ ),
24
+ ]
@@ -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
+ ]
@@ -5,6 +5,8 @@ from django.conf import settings
5
5
  from django.db.models.functions import Lower
6
6
  from django.utils.translation import gettext_lazy as _
7
7
  from django.db import models
8
+ import logging
9
+ _logger = logging.getLogger(__name__)
8
10
 
9
11
 
10
12
  class Log(models.Model):
@@ -14,7 +16,7 @@ class Log(models.Model):
14
16
  verbose_name_plural = _('Logs')
15
17
  db_table = 'accrete_log'
16
18
  indexes = [
17
- models.Index(fields=['model', 'object_id'])
19
+ models.Index(fields=['model', 'object_id', 'tenant_id'])
18
20
  ]
19
21
  constraints = [
20
22
  models.UniqueConstraint(
@@ -61,7 +63,8 @@ class Log(models.Model):
61
63
  ('bool', 'Boolean'),
62
64
  ('str', 'String'),
63
65
  ('date', 'Date'),
64
- ('datetime', 'Date Time')
66
+ ('datetime', 'Date Time'),
67
+ ('json', 'JSON')
65
68
  ],
66
69
  max_length=100,
67
70
  )
@@ -76,7 +79,8 @@ class Log(models.Model):
76
79
  ('bool', 'Boolean'),
77
80
  ('str', 'String'),
78
81
  ('date', 'Date'),
79
- ('datetime', 'Date Time')
82
+ ('datetime', 'Date Time'),
83
+ ('json', 'JSON')
80
84
  ],
81
85
  max_length=100
82
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>
@@ -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.155
3
+ Version: 0.0.157
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
@@ -25,11 +25,11 @@ accrete/contrib/country/migrations/0002_auto_20250219_1759.py,sha256=hSP0WEErHHJ
25
25
  accrete/contrib/country/migrations/0003_alter_country_options.py,sha256=0reOOdHuApMA5pw4ga6BW63TCG2U1i8T8oSug7EjUXw,428
26
26
  accrete/contrib/country/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  accrete/contrib/log/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- accrete/contrib/log/admin.py,sha256=g-wdWF2O62rR0e_rLSgof_z8m42Qqv5VBrl_sFB0qlo,1212
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=XRElQUV6Obj4BCMTXE85jcpEup7m-MCRVfquxmt9_Xc,6210
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
@@ -39,13 +39,15 @@ accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.p
39
39
  accrete/contrib/log/migrations/0003_alter_log_tenant.py,sha256=yp3WizRdAPvPctMiCmKcsqVix3a0LaIRmuAB6LJ6Gb0,582
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
+ 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
42
44
  accrete/contrib/log/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
45
  accrete/contrib/sequence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
46
  accrete/contrib/sequence/admin.py,sha256=mTjab5cVklRUIQcSrsUo-_JgtXEsSdcFj_gfWhlStS4,273
45
47
  accrete/contrib/sequence/apps.py,sha256=2SalOz9piCrbOPudCh0grN1eojN9kEC4-jcNzBmfqEk,164
46
48
  accrete/contrib/sequence/forms.py,sha256=cdjLIytH7WlJK-B2Y6xRRPjOijkK36XpqUuIe4yLLj0,248
47
49
  accrete/contrib/sequence/models.py,sha256=UEuPvg1StovPW1n9yF-f31nBq4aTj5zpfS10oqcf60E,887
48
- accrete/contrib/sequence/queries.py,sha256=VT4pbYKzVAEE_8oPOaavdcCPi-zPiX1BwdVviWh8XKM,683
50
+ accrete/contrib/sequence/queries.py,sha256=6BI2VGerXkeblZleII8Z2hsLOgzlSguvPGa3VNUSTC4,702
49
51
  accrete/contrib/sequence/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
50
52
  accrete/contrib/sequence/views.py,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63
51
53
  accrete/contrib/sequence/migrations/0001_initial.py,sha256=iAR_hhGN2wDAk40IS9PwEsm7iYqfgasoKRrTLFEpOY8,1352
@@ -62,7 +64,7 @@ accrete/contrib/system_mail/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2
62
64
  accrete/contrib/system_mail/views.py,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63
63
65
  accrete/contrib/system_mail/migrations/0001_initial.py,sha256=6cwkkRXGjXvwXoMjjgmWmcPyXSTlUbhW1vMiHObk9MQ,1074
64
66
  accrete/contrib/system_mail/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- accrete/contrib/ui/__init__.py,sha256=MNeG4PxPZIY_mc_AbxgnrX07OdYvSQCGX8jL1qTQ0t4,391
67
+ accrete/contrib/ui/__init__.py,sha256=xR7k0S_0yXYNVHPy41BrbAUrpM0EHHBSDWqw1bVmFqo,414
66
68
  accrete/contrib/ui/admin.py,sha256=MKShWrFexu9_k-lcCAwn1i1SlKqFV2ScCLo_pU5dX4E,245
67
69
  accrete/contrib/ui/apps.py,sha256=E0ao2ox6PQ3ldfeR17FXJUUJuGiWjm2DPCxHbPXGzls,152
68
70
  accrete/contrib/ui/config.py,sha256=g2nvcsFq9aTleauTRUbV7TJGQ5I6xId-LpeSgoWNIXI,192
@@ -70,7 +72,7 @@ accrete/contrib/ui/filter.py,sha256=MZfy6p4Q6TVvtjl5nF7_6CemOe1twbk0Bj5LWptjcwM,
70
72
  accrete/contrib/ui/forms.py,sha256=Ul3daXNwWLN1G3ppwOvNztrilIAGeLwNY1a-g-njrjQ,2049
71
73
  accrete/contrib/ui/middleware.py,sha256=fVjKeDXnGiJw7NRYZK3nCkj7g-MAainiBl-VhpE3XdQ,1792
72
74
  accrete/contrib/ui/models.py,sha256=ikwd7vHuq0R_qcr_gczcHHRvkXwr-zJMrfrriIUJD7U,3426
73
- accrete/contrib/ui/response.py,sha256=0wkGpn6XJQRBDA6AYJKtnkTx_jzkJXqrLWE4i6RHVKQ,14635
75
+ accrete/contrib/ui/response.py,sha256=q6V6vSHbioUYbkIUtYbRidmbryTE84Qb9Nu4oZetwJ8,14809
74
76
  accrete/contrib/ui/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
75
77
  accrete/contrib/ui/urls.py,sha256=5XUfK85HYWYf7oopMoJEEYmQ6pNgHgZBErBEn97pBt4,337
76
78
  accrete/contrib/ui/views.py,sha256=foVB7rx3_FWU9fkPdUKiqkVsWraAyfenC2OTNyYt7lI,4644
@@ -202,6 +204,7 @@ accrete/contrib/ui/templates/django/forms/widgets/date.html,sha256=s-YWfQ8b2w2fR
202
204
  accrete/contrib/ui/templates/django/forms/widgets/email.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48
203
205
  accrete/contrib/ui/templates/django/forms/widgets/file.html,sha256=J1NmXmQTp6IU48K-zRdLeYl-1Tpavx6ZAo3cPIP9Y6Y,755
204
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
205
208
  accrete/contrib/ui/templates/django/forms/widgets/select.html,sha256=uSfDpOQox2mEKDm9LWJ6jg5rCa3jCbHHTcmOadFLlBg,455
206
209
  accrete/contrib/ui/templates/django/forms/widgets/text.html,sha256=MSmLlQc7PsPoDLVtTOOiWNprrsPriNr712yFxaHyDIo,47
207
210
  accrete/contrib/ui/templates/django/forms/widgets/textarea.html,sha256=c9BTedqb3IkXLyVYd0p9pR8DFnsXCNGoxVBWZTk_Fic,278
@@ -210,11 +213,11 @@ accrete/contrib/ui/templates/ui/content_right.html,sha256=aOFjbtXjjlqwmHpGoEpAUz
210
213
  accrete/contrib/ui/templates/ui/custom_theme.html,sha256=son43yhp-7ROTpRU9SY3pSgxXDdFiuHa1ThkCG8bnwk,695
211
214
  accrete/contrib/ui/templates/ui/detail.html,sha256=V0HccLE0Pb-5haQFpvIoWZfF1UOrvMwPYv2UTwRnt_A,293
212
215
  accrete/contrib/ui/templates/ui/favicon.html,sha256=ZSK6qDGV4Cexgt0VA3KOHYN100yZHOFjfOiFZVudWg0,90
213
- accrete/contrib/ui/templates/ui/form_error.html,sha256=WWqfFWyJ_LCzm5IkxXztn23GFak5wyM2HZcmiZ3Eq9s,417
214
- accrete/contrib/ui/templates/ui/layout.html,sha256=2Geugdxea9Qw8LFsePg9-BE4NtpeI3Ems1WarpyqC2A,15020
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
215
218
  accrete/contrib/ui/templates/ui/list.html,sha256=jzxklYBF_oDLKvXxYe-h3x2r5PK04A8flWnZ5-qZ4rM,2392
216
219
  accrete/contrib/ui/templates/ui/list_update.html,sha256=CUV-OJCieOBrtSbh0vAoyZYL-_e9lP7vQrY4j1TlT7M,276
217
- 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
218
221
  accrete/contrib/ui/templates/ui/modal.html,sha256=sJI7YwTHPvirNlig69A08z7sk_5aYRmyeAUWzm1ceVs,3464
219
222
  accrete/contrib/ui/templates/ui/oob.html,sha256=lZHIBBYclefbGkKguS1A7vrtOhODJizbSRaGAAHDvG8,267
220
223
  accrete/contrib/ui/templates/ui/table.html,sha256=ATxvStGMsc0Fz4FkUD2xZs_xhbY1-Zn1zGTrBE_w62s,3792
@@ -224,14 +227,14 @@ accrete/contrib/ui/templates/ui/filter/query_input.html,sha256=OYXO0l5kVOvsnOYUs
224
227
  accrete/contrib/ui/templates/ui/filter/query_operator.html,sha256=h4WWLDnse6DK5Rb_0TTb0wqWxhvY_g3qjwx8_eENMuI,569
225
228
  accrete/contrib/ui/templates/ui/filter/query_params.html,sha256=9Kyb-dQRitjeruIEx1HJUI0elznb0KSV5fJR6keWi_4,9994
226
229
  accrete/contrib/ui/templates/ui/filter/query_tags.html,sha256=ooeIwIwvhT0fG5SMAuLoMquTVUmYf5n50DM-3gC_iAo,1567
227
- accrete/contrib/ui/templates/ui/templatetags/field.html,sha256=3wkjN-OJ6Em0_xskDWak9gpOVbNaXGU3RAMsxBwPH-8,3141
228
- 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
229
232
  accrete/contrib/ui/templates/ui/widgets/date_weekday.html,sha256=l5k7lFJjdao49Q6oyGf20go-bXJFlidTuUVKYOuISGE,628
230
233
  accrete/contrib/ui/templates/ui/widgets/model_search_select.html,sha256=Pv28g0CRBTeW--v9LoP39NDDc18RGEC8Hu9MAN-Tsi0,2996
231
234
  accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html,sha256=stEhZXCvaj8jjRTg1chwQmyWPeseQaDrLPr257vNtGo,4697
232
235
  accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html,sha256=4Wky0XkYWZlIKXTXzGjJkJTX3H9rhjXTY1hYai3Q3TA,242
233
236
  accrete/contrib/ui/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
234
- accrete/contrib/ui/templatetags/ui.py,sha256=7KmBsQ-q9poHSs2EC5pkkMC-pp9b-kj3RMymggZ4UGM,7461
237
+ accrete/contrib/ui/templatetags/ui.py,sha256=pgg9BRlPS0ogsFEl-4DjLhSeE3ThaRWMmbpyv9xm7sQ,7695
235
238
  accrete/contrib/ui/widgets/__init__.py,sha256=2mcvXyFNdFkqOVHGUBDbLmbaJnWnoFaS1uc4dqmdtpE,106
236
239
  accrete/contrib/ui/widgets/date_weekday.py,sha256=r6VNE8dwGVZq4jJLGF_MP320-yp482Iykh-WsjeY9XU,148
237
240
  accrete/contrib/ui/widgets/search_select.py,sha256=CnWQp2JpzjNJy9arG_sFWoRvVs29x9OzdgULm7yh7d0,3745
@@ -241,7 +244,7 @@ accrete/contrib/user/apps.py,sha256=oHDrAiHf-G57mZLyxqGJzRY2DbPprGFD-QgyVJG_ruI,
241
244
  accrete/contrib/user/auth_backends.py,sha256=doGdxil4fjhgY5oC2s8zueQq-bQsZ1fyiAo46HyBHLk,598
242
245
  accrete/contrib/user/forms.py,sha256=aryAdsBmOw9sUE2xd7A3CKPPvZd_2pKilbtdEO3J-D0,3295
243
246
  accrete/contrib/user/middleware.py,sha256=qblcujwJsthopagyT-hPFq4HsMyGt-VvqZw5TQopBjk,403
244
- accrete/contrib/user/models.py,sha256=TDED3rTF_5H6u65As6h94DrptW7wMJjUUzuvVkNedR0,6338
247
+ accrete/contrib/user/models.py,sha256=pz4bfiNmk45Ld2TT1rrJInhNrqYqesz7IRnfQjm8oRI,6390
245
248
  accrete/contrib/user/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
246
249
  accrete/contrib/user/urls.py,sha256=_fBa--3NfyYN10Td7PGHpetJYy42SMqTyCCXhgynkEQ,407
247
250
  accrete/contrib/user/views.py,sha256=u0lJ3ZWMKpgcx8iF8W0LVGP2Cu4VtkIdEiuko2rBBms,4257
@@ -257,6 +260,7 @@ accrete/contrib/user/migrations/0007_user_managed_login.py,sha256=SfG1Yj9m_g-sZb
257
260
  accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py,sha256=XypG6tN0WmLyJV8sbZgSVqNFbTxRsBHWhIRyMJGfV7c,655
258
261
  accrete/contrib/user/migrations/0009_alter_user_theme.py,sha256=o5s0NCEhauE72Z35q3ggsy3-L8PhFmRnQ2x4dlR1aQE,517
259
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
260
264
  accrete/contrib/user/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
261
265
  accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html,sha256=kp0_IGY3aRXktrlauruW0ciF84rpR0VzI0PUw7rzSag,351
262
266
  accrete/contrib/user/templates/user/change_email.html,sha256=frkoUCUwNtVSe9fhxmFmiM8T3RaFzLKOpAv5gZ7F-AY,473
@@ -292,9 +296,9 @@ accrete/utils/__init__.py,sha256=ZqTvAA625k3NVZHXb4PpPOVAIV3gUESfCe6Ad2f1wuM,361
292
296
  accrete/utils/dates.py,sha256=apM6kt6JhGrKgoT0jfav1W-8AUVTxNc9xt3fJQ2n0JI,1492
293
297
  accrete/utils/forms.py,sha256=naV4urdfvmpxcx5Vf3Fo72M5Fy8DjGg5-vkysMKptbA,3914
294
298
  accrete/utils/log.py,sha256=BH0MBDweAjx30wGBO4F3sFhbgkSoEs7T1lLLjlYZNnA,407
295
- accrete/utils/models.py,sha256=0uDhiWl7G2MDnbdYcAdKaIArw-NFMSwRArCcZ0FrZSk,1509
299
+ accrete/utils/models.py,sha256=o_nvvwXf8L9hg_6mkFmC9ok7eFZ0auZ0kUC7Buw7du8,2205
296
300
  accrete/utils/views.py,sha256=LE9pZ1x9f7ioaPYydbrN4t1b0o6NIIq0qUjPTb1Qkbw,5022
297
- accrete-0.0.155.dist-info/METADATA,sha256=OUKsvr4vjzDsiJwQJzvD_sDEV8PpssCVmhgFCYEbWKM,4953
298
- accrete-0.0.155.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
299
- accrete-0.0.155.dist-info/licenses/LICENSE,sha256=vHwb4Qnv8UfYKFiCWyTuRGsi49x19UQwHRCky3b2_NE,1057
300
- accrete-0.0.155.dist-info/RECORD,,
301
+ accrete-0.0.157.dist-info/METADATA,sha256=PcfA_BA6FNuO0AWfmEGL7W54H2EtHIkikgKQdOTVX3E,4953
302
+ accrete-0.0.157.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
303
+ accrete-0.0.157.dist-info/licenses/LICENSE,sha256=vHwb4Qnv8UfYKFiCWyTuRGsi49x19UQwHRCky3b2_NE,1057
304
+ accrete-0.0.157.dist-info/RECORD,,