accrete 0.0.99__py3-none-any.whl → 0.0.101__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.
@@ -29,3 +29,5 @@ from .elements import (
29
29
  TableFieldType,
30
30
  Icon
31
31
  )
32
+
33
+ from . import components
@@ -0,0 +1 @@
1
+ from .search_select import ModelSearchSelectOptions
@@ -0,0 +1,18 @@
1
+ from dataclasses import dataclass
2
+
3
+ from django.db.models import QuerySet
4
+ from django.template.loader import render_to_string
5
+ from django.utils.safestring import mark_safe
6
+
7
+
8
+ @dataclass
9
+ class ModelSearchSelectOptions:
10
+
11
+ queryset: QuerySet
12
+ template: str = 'ui/components/model_search_select_options.html'
13
+
14
+ def get_context(self):
15
+ return {'options': self.queryset}
16
+
17
+ def __str__(self):
18
+ return mark_safe(render_to_string(self.template, self.get_context()))
@@ -0,0 +1,101 @@
1
+ from django.forms import widgets
2
+ from django.shortcuts import resolve_url
3
+
4
+
5
+ class ModelSearchSelect(widgets.NumberInput):
6
+ template_name = 'ui/widgets/model_search_select.html'
7
+ option_template_name = 'ui/widgets/model_search_select_options.html'
8
+ input_type = 'number'
9
+
10
+ def __init__(
11
+ self,
12
+ search_url: str,
13
+ search_parameter: str = 'search',
14
+ limit: int | None = 5,
15
+ hx_trigger_on_change: bool = False,
16
+ choices=()
17
+ ):
18
+ super().__init__()
19
+ self.search_url = search_url
20
+ self.search_parameter = search_parameter
21
+ self.limit = limit
22
+ self.hx_trigger_on_change = hx_trigger_on_change
23
+ self.choices = choices
24
+
25
+ def get_context(self, name, value, attrs):
26
+ qs = self.choices.queryset
27
+ if self.limit:
28
+ qs = qs[:self.limit]
29
+
30
+ context = {
31
+ "widget": {
32
+ "name": name,
33
+ "is_hidden": self.is_hidden,
34
+ "required": self.is_required,
35
+ "value": self.format_value(value or ''),
36
+ 'value_display': self.value_display(value),
37
+ "attrs": self.build_attrs(self.attrs, attrs),
38
+ "template_name": self.template_name,
39
+ 'search_url': self.search_url,
40
+ 'search_parameter': self.search_parameter,
41
+ 'hx_trigger_on_change': self.hx_trigger_on_change
42
+ },
43
+ 'options': qs
44
+ }
45
+ return context
46
+
47
+ def format_value(self, value):
48
+ res = super().format_value(value)
49
+ return res or ''
50
+
51
+ def value_display(self, value):
52
+ if value is None:
53
+ return ''
54
+ try:
55
+ value = int(value)
56
+ except ValueError:
57
+ return ''
58
+ return str(self.choices.queryset.get(pk=value))
59
+
60
+
61
+ class ModelSearchSelectMulti(widgets.SelectMultiple):
62
+ template_name = 'ui/widgets/model_search_select_multi.html'
63
+ option_template_name = 'ui/widgets/model_search_select_options.html'
64
+ input_type = 'number'
65
+
66
+ def __init__(
67
+ self,
68
+ search_url: str,
69
+ search_parameter: str = 'search',
70
+ limit: int | None = 5,
71
+ hx_trigger_on_change: bool = False,
72
+ choices=()
73
+ ):
74
+ super().__init__()
75
+ self.search_url = search_url
76
+ self.search_parameter = search_parameter
77
+ self.limit = limit
78
+ self.hx_trigger_on_change = hx_trigger_on_change
79
+ self.choices = choices
80
+
81
+ def get_context(self, name, value, attrs):
82
+ qs = self.choices.queryset
83
+ if self.limit:
84
+ qs = qs[:self.limit]
85
+
86
+ context = {
87
+ "widget": {
88
+ "name": name,
89
+ "is_hidden": self.is_hidden,
90
+ "required": self.is_required,
91
+ "value": self.format_value(value),
92
+ "attrs": self.build_attrs(self.attrs, attrs),
93
+ "template_name": self.template_name,
94
+ 'search_url': resolve_url(self.search_url),
95
+ 'search_parameter': self.search_parameter,
96
+ 'hx_trigger_on_change': self.hx_trigger_on_change
97
+ },
98
+ 'options': qs,
99
+ 'selected': self.choices.queryset.filter(pk__in=value) if value else qs.none()
100
+ }
101
+ return context
@@ -0,0 +1,9 @@
1
+ <div class="field">
2
+ <p class="control">
3
+ <input class="{% if widget.type != 'checkbox' %}input{% endif %} is-fullwidth"
4
+ name="{{ widget.name }}" type="{{ widget.type }}"
5
+ {% if widget.value != None %} value="{{ widget.value|stringformat:'s' }}"{% endif %}
6
+ {% include "django/forms/widgets/attrs.html" %}
7
+ >
8
+ </p>
9
+ </div>
@@ -0,0 +1,3 @@
1
+ {% for obj in selected %}
2
+ <option selected value="{{ obj.pk }}"></option>
3
+ {% endfor %}
@@ -0,0 +1,6 @@
1
+ {% for obj in selected %}
2
+ <span class="tag" style="white-space: normal; height: fit-content">
3
+ {{ obj }}
4
+ <button class="delete is-small" type="button" data-value="{{ obj.pk }}"></button>
5
+ </span>
6
+ {% endfor %}
@@ -0,0 +1,3 @@
1
+ {% for option in options %}
2
+ <button type="button" class="dropdown-item px-1" value="{{ option.pk }}" style="word-wrap: break-word; width: 100%; white-space: normal">{{ option }}</button>
3
+ {% endfor %}
@@ -11,7 +11,7 @@
11
11
  <meta name="viewport" content="width=device-width, initial-scale=1">
12
12
  {% block favicon %}<link rel="icon" type="image/svg" href="{% static 'icons/accrete.svg' %}"/>{% endblock %}
13
13
  {% block style %}
14
- <link rel="stylesheet" type="text/css" href="{% static "css/accrete.css" %}?v=0.0.93">
14
+ <link rel="stylesheet" type="text/css" href="{% static "css/accrete.css" %}?v=0.0.100">
15
15
  <link rel="stylesheet" type="text/css" href="{% static "css/icons.css" %}">
16
16
  <link rel="stylesheet" type="text/css" href="{% static "css/fa.css" %}">
17
17
  {% endblock %}
@@ -3,6 +3,7 @@
3
3
  <div id="modal-{{ form_id }}" class="modal {% block modal_form_class %}is-active{% endblock %}"
4
4
  hx-swap="outerHTML"
5
5
  hx-target="#modal-{{ form_id }}"
6
+ hx-on:delete="removeModal('modal-{{ form_id }}')"
6
7
  {% if blocking %}
7
8
  hx-indicator="#modal-{{ form_id }}-indicator"
8
9
  hx-disabled-elt="#modal-{{ form_id }}-background"
@@ -0,0 +1,53 @@
1
+ {% load static %}
2
+ {% load i18n %}
3
+
4
+
5
+ <script>
6
+ function modelSearchSelect() {
7
+ return {
8
+ open: false,
9
+
10
+ shouldClose(event) {
11
+ return event.relatedTarget === this.$refs.dropdownContent || this.$refs.dropdownContent.contains(event.relatedTarget)
12
+ }
13
+ }
14
+ }
15
+ </script>
16
+
17
+
18
+ <div class="field select" x-data="modelSearchSelect()" @click.outside="open = false">
19
+ <input id="id_{{ widget.name }}_value" hidden="hidden" type="{{ widget.type }}" name="{{ widget.name }}" x-ref="inputValue" aria-label="inputValue"
20
+ value="{{ widget.value }}"
21
+ >
22
+ <input id="id_{{ widget.name }}_display" class="input" type="text" readonly x-ref="inputDisplay" value="{{ widget.value_display }}" aria-label="inputDisplay"
23
+ style="padding-right: 30px"
24
+ x-on:focus="open = true;"
25
+ x-on:keydown="if ($event.keyCode == 27) {document.activeElement.blur()} else if ($event.keyCode != 9) {$refs.searchInput.focus();}"
26
+ x-on:focusout="open = shouldClose($event)"
27
+ >
28
+ <div style="position: relative; z-index: 90;">
29
+ <div x-show="open" class="box pt-1" x-ref="dropdownContent" tabindex="-1" x-transition>
30
+ <input id="id_{{ widget.name }}_search" type="search" autocomplete="off" class="input" x-ref="searchInput" aria-label="search"
31
+ name="{{ widget.search_parameter }}"
32
+ placeholder="{% translate 'Type to search' %}"
33
+ x-on:keydown="if ($event.keyCode == 27) {document.activeElement.blur()}"
34
+ x-on:focusout="open = shouldClose($event)"
35
+ hx-get="{{ widget.search_url }}"
36
+ hx-trigger="input changed delay:500ms, search"
37
+ hx-target="#{{ widget.name }}_dropdown_items"
38
+ >
39
+ <div x-on:click="$refs.inputValue.setAttribute('value', $event.target.value); $refs.inputDisplay.value = $event.target.innerText; htmx.trigger($refs.inputValue, 'submit'); open = false; {% if widget.hx_trigger_on_change %}htmx.trigger('#id_{{ widget.name }}_value', 'change');{% endif %}"
40
+ x-on:keydown="if ($event.keyCode == 27) {document.activeElement.blur()} else if ($event.keyCode != 9 && $event.keyCode != 13) {$refs.searchInput.focus();}"
41
+ >
42
+ {% if not widget.required %}
43
+ <div class="hoverable" style="max-height: 200px; width: 100%; overflow-y: auto;">
44
+ <button type="button" class="dropdown-item px-1" value="" style="word-wrap: break-word; width: 100%; white-space: normal">---------</button>
45
+ </div>
46
+ {% endif %}
47
+ <div id="{{ widget.name }}_dropdown_items" class="hoverable" style="max-height: 200px; width: 100%; overflow-y: auto;">
48
+ {% include 'ui/components/model_search_select_options.html' %}
49
+ </div>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </div>
@@ -0,0 +1,67 @@
1
+ {% load i18n %}
2
+
3
+ <div class="" x-data="{open: false, shouldClose(event) {return event.relatedTarget == $refs.dropdownContent || $refs.dropdownContent.contains(event.relatedTarget);} }"
4
+ @click.outside="open = false" style="width: 100%"
5
+ >
6
+ <select multiple id="{{ widget.attrs.id }}" hidden="hidden" name="{{ widget.name }}" aria-label="{{ widget.name }}" x-ref="inputValue">
7
+ {% include 'ui/components/model_search_select_multi_selected_options.html' %}
8
+ </select>
9
+ <div id="{{ widget.attrs.id }}_display" class="input select py-1 pl-1" tabindex="0" x-ref="inputDisplay" aria-label="inputDisplay"
10
+ style="padding-right: 30px; border-radius: 0; border-top: 0; border-right:0; border-left: 0; min-height: var(--bulma-control-height); height: fit-content; width: 100%"
11
+ x-on:focus="open = true;"
12
+ x-on:keydown="if ($event.keyCode == 27) {document.activeElement.blur()} else if ($event.keyCode != 9) {$refs.searchInput.focus();}"
13
+ x-on:focusout="open = shouldClose($event)"
14
+ >
15
+ <div class="tags" x-ref="inputDisplayTags"
16
+ @click="
17
+ if ($event.target.classList.contains('delete')) {
18
+ let val = $event.target.getAttribute('data-value');
19
+ $refs.inputValue.querySelector(`option[value=${CSS.escape(val)}]`).remove();
20
+ $event.target.parentElement.remove();
21
+ }
22
+ ">
23
+ {% include 'ui/components/model_search_select_multi_tags.html' %}
24
+ </div>
25
+ </div>
26
+ <div style="position: relative; z-index: 90;">
27
+ <div x-show="open" class="box pt-1" x-ref="dropdownContent" tabindex="-1" x-transition style="position: absolute; min-width: 100%">
28
+ <input id="id_{{ widget.name }}_search" type="search" autocomplete="off" class="input" x-ref="searchInput" aria-label="search"
29
+ name="{{ widget.search_parameter }}"
30
+ placeholder="{% translate 'Type to search' %}"
31
+ x-on:keydown="if ($event.keyCode == 27) {document.activeElement.blur()}"
32
+ x-on:focusout="open = shouldClose($event)"
33
+ hx-get="{{ widget.search_url }}"
34
+ hx-trigger="input changed delay:500ms, search"
35
+ hx-target="#{{ widget.name }}_dropdown_items"
36
+ >
37
+ <div id="{{ widget.name }}_dropdown_items" class="hoverable" style="max-height: 200px; width: 100%; overflow-y: auto;"
38
+ x-on:click="
39
+ if (! $refs.inputValue.querySelectorAll(`option[value=${CSS.escape($event.target.value)}]`).length) {
40
+ let option = document.createElement('option');
41
+ let tag = document.createElement('span');
42
+ let delButton = document.createElement('button');
43
+ option.setAttribute('selected', '');
44
+ option.value = $event.target.value;
45
+ tag.classList.add('tag');
46
+ tag.innerText = $event.target.innerText;
47
+ tag.style.whiteSpace = 'normal';
48
+ tag.style.height = 'fit-content';
49
+ delButton.classList.add('delete', 'is-small');
50
+ delButton.type = 'button';
51
+ delButton.setAttribute('data-value', $event.target.value);
52
+ tag.appendChild(delButton);
53
+ $refs.inputValue.appendChild(option);
54
+ $refs.inputDisplayTags.appendChild(tag);
55
+ };
56
+ {% if widget.hx_trigger_on_change %}htmx.trigger('#{{ widget.attrs.id }}_value', 'change');{% endif %}
57
+ "
58
+ x-on:keydown="
59
+ if ($event.keyCode == 27) {document.activeElement.blur()}
60
+ else if ($event.keyCode != 9 && $event.keyCode != 13) {$refs.searchInput.focus();}
61
+ "
62
+ >
63
+ {% include 'ui/components/model_search_select_options.html' %}
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </div>
@@ -120,7 +120,7 @@ def timedelta_cast(td: timedelta, code: str) -> str | None:
120
120
 
121
121
 
122
122
  @register.filter(name='weekday')
123
- def datetime_to_weekday(dt: datetime|date, default=None):
123
+ def datetime_to_weekday(dt: datetime|date, default=None) -> str:
124
124
  if dt is None:
125
125
  return default
126
126
  mapping = {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: accrete
3
- Version: 0.0.99
3
+ Version: 0.0.101
4
4
  Summary: Django Shared Schema Multi Tenant
5
5
  Author-email: Benedikt Jilek <benedikt.jilek@pm.me>
6
6
  License: Copyright (c) 2023 Benedikt Jilek
@@ -34,7 +34,7 @@ accrete/contrib/system_mail/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2
34
34
  accrete/contrib/system_mail/views.py,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63
35
35
  accrete/contrib/system_mail/migrations/0001_initial.py,sha256=6cwkkRXGjXvwXoMjjgmWmcPyXSTlUbhW1vMiHObk9MQ,1074
36
36
  accrete/contrib/system_mail/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- accrete/contrib/ui/__init__.py,sha256=RiJ8hNHSpkVfT_fpwP_3XXnNo9q5E-7G59xMC6PsrWE,570
37
+ accrete/contrib/ui/__init__.py,sha256=WmsbOxYjh2PpInP7-rHidgkjunGb8ujc5I1AL3anXTM,596
38
38
  accrete/contrib/ui/admin.py,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63
39
39
  accrete/contrib/ui/apps.py,sha256=E0ao2ox6PQ3ldfeR17FXJUUJuGiWjm2DPCxHbPXGzls,152
40
40
  accrete/contrib/ui/context.py,sha256=Awpt3kcjn_REJsZ3xDq71WitPefBLCj2N5FrAZfDXYE,10155
@@ -43,6 +43,9 @@ accrete/contrib/ui/filter.py,sha256=N3_h-AeN3VQdkGAGREHTGTRDRzcOrlk0Q2rbdTQyevA,
43
43
  accrete/contrib/ui/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
44
44
  accrete/contrib/ui/urls.py,sha256=UrRRroqP6ANW_jpkRWqo2yLvBhYOVhczzbxbfkGnoq4,124
45
45
  accrete/contrib/ui/views.py,sha256=Eewx1n_fOAqx_nP4mvGltaksUtp1_WhCJThtK13YiQc,106
46
+ accrete/contrib/ui/components/__init__.py,sha256=B-0S010wPC-XSsEGGURCJDlaEdpSMphiO67XkOFRmQc,52
47
+ accrete/contrib/ui/components/search_select.py,sha256=s1VeJm0Jhn0ix2kG7hAXO-jd6jlPjwGxh-tw86fBs1k,481
48
+ accrete/contrib/ui/forms/widgets.py,sha256=mo5E6qT8zDBEGHJQ6GCN8epjOYIo0kLxNgvQnq19vGU,3298
46
49
  accrete/contrib/ui/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
50
  accrete/contrib/ui/static/bulma/LICENSE,sha256=--fY7Bi3Lt7RXXnKc9pe756OJY9fGv-D5OmT5pdSJ5w,1080
48
51
  accrete/contrib/ui/static/bulma/README.md,sha256=dXEZ8Xo6lwH7mVf_Uy8P_rpOORrwicW5481xDTArOmU,14237
@@ -158,6 +161,7 @@ accrete/contrib/ui/static/webfonts/fa-solid-900.woff2,sha256=n8hfOkVEqw1XDH-Pm7u
158
161
  accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf,sha256=CWY6NvwF5xkK-DJLhVEFxbtRGtlPlLgbNK_uUDJ57KI,10832
159
162
  accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2,sha256=TUotf9HGaEhFyxdP3X_Ac71ky3QShvskf4t2wre4UsQ,4792
160
163
  accrete/contrib/ui/templates/django/forms/widgets/attrs.html,sha256=zNxjU4Ta_eWZkh1WhrF_VIwNZ0lZyl980gSSijUK51k,195
164
+ accrete/contrib/ui/templates/django/forms/widgets/date.html,sha256=bKx0aGuvOM6yxNlgQOVKupPqg6tcmjxMKYRQLDscPmo,385
161
165
  accrete/contrib/ui/templates/django/forms/widgets/email.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48
162
166
  accrete/contrib/ui/templates/django/forms/widgets/file.html,sha256=J1NmXmQTp6IU48K-zRdLeYl-1Tpavx6ZAo3cPIP9Y6Y,755
163
167
  accrete/contrib/ui/templates/django/forms/widgets/input.html,sha256=CRu81kTsbPwis7NknCv6i7EQkOwexR9rURaRpoGHBek,248
@@ -167,14 +171,17 @@ accrete/contrib/ui/templates/django/forms/widgets/textarea.html,sha256=c9BTedqb3
167
171
  accrete/contrib/ui/templates/ui/dashboard.html,sha256=udnwiSJEcn2wMaJfTs4P0Y20FU79VguK_9Lq4K2BqtM,160
168
172
  accrete/contrib/ui/templates/ui/detail.html,sha256=-Nksyufbf4onufqmFGTAW_BxLRNSWv1A9n8Qs2a6aCo,564
169
173
  accrete/contrib/ui/templates/ui/form.html,sha256=uCtP16THdOuRfs3JdsjadIW0k9b2rN3GAsRSTfSUWak,691
170
- accrete/contrib/ui/templates/ui/layout.html,sha256=qUACs0vR3xn5gjoJly_zexdw9XEzu_EdF2Is6y-CvJM,15649
174
+ accrete/contrib/ui/templates/ui/layout.html,sha256=MUrb19FvoOKAgxek8NCxA23uFr-Jgmvg7eqK1rqgUOc,15650
171
175
  accrete/contrib/ui/templates/ui/list.html,sha256=ahN8SgF4kE3OEy6EBeDBdDQvuXx-CyIgbixYd-KdV4k,1751
172
176
  accrete/contrib/ui/templates/ui/table.html,sha256=8ELtgxoapCyNsvmGISAGXe712lG6AkP_nekb4OVLK3I,4481
177
+ accrete/contrib/ui/templates/ui/components/model_search_select_multi_selected_options.html,sha256=1fDpCnotpGFH7bzqllwbVixH1DB1-akbso5eH8cL4iU,91
178
+ accrete/contrib/ui/templates/ui/components/model_search_select_multi_tags.html,sha256=FV2pc5qaJil19reZXWzLgrUlcXyugdwunZ12lv6COfg,231
179
+ accrete/contrib/ui/templates/ui/components/model_search_select_options.html,sha256=TECaTLnkmVoUZBhehLwcSjyfgwvhXX2ZBiqSro9ap_U,203
173
180
  accrete/contrib/ui/templates/ui/partials/filter.html,sha256=fMxi5L1daqKElzZpHg8bItv0FlBjOkAEBxmT_OXgg4M,7434
174
181
  accrete/contrib/ui/templates/ui/partials/form_errors.html,sha256=C5ktasYff2xBTiWfM6QR8qaGKSyK9QufB3B9N77KGpg,1386
175
182
  accrete/contrib/ui/templates/ui/partials/header.html,sha256=wBiyo02mON3z7l4hJAPTAJn_vDhekYZ-a0g8TuW4RmY,7015
176
183
  accrete/contrib/ui/templates/ui/partials/modal.html,sha256=Lk7ViKJS99QLjGFHKna90j6VUo_U03IDAT1Rq__QVLU,1472
177
- accrete/contrib/ui/templates/ui/partials/modal_form.html,sha256=7E3mh_rE_6-lnaFW0ACO2l_mCba8Rqah1ltshYKULIo,2103
184
+ accrete/contrib/ui/templates/ui/partials/modal_form.html,sha256=_2cvsihB1tIZ5ydh2Vop_5fBVH-Nqwc01eYxh2TH2BQ,2158
178
185
  accrete/contrib/ui/templates/ui/partials/onchange_form.html,sha256=8wNgZYnpa6ttc-OraOi1i02isJCcnaMtYwsmObc3qcY,109
179
186
  accrete/contrib/ui/templates/ui/partials/pagination_detail.html,sha256=58nA3X7Il0FAD4VcYyr7tTGWRiVf_FN1TkImmKEpKHU,1014
180
187
  accrete/contrib/ui/templates/ui/partials/pagination_list.html,sha256=Eyx1lsk9UIFFYPICL7RuYeUFaKVlmvWVXnFCGR-II7k,1324
@@ -182,8 +189,10 @@ accrete/contrib/ui/templates/ui/partials/table_field.html,sha256=4oQw0na9UgHP8lo
182
189
  accrete/contrib/ui/templates/ui/partials/table_field_float.html,sha256=GH_jFdpk8wEJXv4QfO6c3URYrZGGLeuSyWwWl2cWxwQ,45
183
190
  accrete/contrib/ui/templates/ui/partials/table_field_monetary.html,sha256=Wtod9vel2dD4vG8lUVLbtls4aU_2EG3p0E1QRRUSH10,166
184
191
  accrete/contrib/ui/templates/ui/partials/table_field_string.html,sha256=GH_jFdpk8wEJXv4QfO6c3URYrZGGLeuSyWwWl2cWxwQ,45
192
+ accrete/contrib/ui/templates/ui/widgets/model_search_select.html,sha256=prJLy58XSJKlqOagI7gcVyHg-pcaUKqCFMfAP4aQEn8,2979
193
+ accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html,sha256=AFoAKEeB99f63CWwL-ougERnj-IQVya_jdDcwW7Bo80,4109
185
194
  accrete/contrib/ui/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
186
- accrete/contrib/ui/templatetags/accrete_ui.py,sha256=en63S5i3uX0NhtYWDpHCA0_mBgpzf_d91dtc2RukNPI,3832
195
+ accrete/contrib/ui/templatetags/accrete_ui.py,sha256=nGd6U5AVZvfwi4yHBoR6YUIIA3vYGkrHCs_m-T__pFk,3839
187
196
  accrete/contrib/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
188
197
  accrete/contrib/user/admin.py,sha256=YS4iApli7XUaIl9GsEJxys2j8sepX0by88omYHjff-E,85
189
198
  accrete/contrib/user/apps.py,sha256=oHDrAiHf-G57mZLyxqGJzRY2DbPprGFD-QgyVJG_ruI,156
@@ -225,7 +234,7 @@ accrete/utils/forms.py,sha256=IvxbXNpSd4a-JBgsTJhs2GHe-DCRWX-xnVPRcoiCzbI,3104
225
234
  accrete/utils/log.py,sha256=BH0MBDweAjx30wGBO4F3sFhbgkSoEs7T1lLLjlYZNnA,407
226
235
  accrete/utils/models.py,sha256=EEhv7-sQVtQD24PEb3XcDUAh3VVhVFoMMLyFrDjGEaI,706
227
236
  accrete/utils/views.py,sha256=iWZSYbd3qYMrV9wAsX26ofGb5wxn1N_nRrQ6s2lpp2I,4557
228
- accrete-0.0.99.dist-info/METADATA,sha256=dCmpvGjRHxHyntrtvFEj8BSk8n59pnVUETAkmZ9fP6E,4952
229
- accrete-0.0.99.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
230
- accrete-0.0.99.dist-info/licenses/LICENSE,sha256=_7laeMIHnsd3Y2vJEXDYXq_PEXxIcjgJsGt8UIKTRWc,1057
231
- accrete-0.0.99.dist-info/RECORD,,
237
+ accrete-0.0.101.dist-info/METADATA,sha256=ZF8MU0HdYFEsShI4phQv86kglt-GWT_BAgpAdqc3Ks8,4953
238
+ accrete-0.0.101.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
239
+ accrete-0.0.101.dist-info/licenses/LICENSE,sha256=_7laeMIHnsd3Y2vJEXDYXq_PEXxIcjgJsGt8UIKTRWc,1057
240
+ accrete-0.0.101.dist-info/RECORD,,