From 1d5254416b11ef1010d5ac31f2a53677254c6497 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 10 Sep 2019 13:38:42 +0200 Subject: Locks: lock_user in model - display lock icon on tables, links - add a warning on sheet --- .../migrations/0054_auto_20190910_1324.py | 28 ++++++++++ .../migrations/0022_auto_20190910_1324.py | 28 ++++++++++ .../migrations/0074_auto_20190910_1324.py | 63 ++++++++++++++++++++++ .../migrations/0066_auto_20190910_1323.py | 58 ++++++++++++++++++++ .../migrations/0040_auto_20190910_1324.py | 33 ++++++++++++ .../migrations/0108_auto_20190910_1323.py | 43 +++++++++++++++ ishtar_common/models.py | 3 ++ ishtar_common/templates/ishtar/sheet.html | 10 ++++ ishtar_common/templatetags/link_to_window.py | 7 ++- ishtar_common/views_item.py | 31 +++++++---- 10 files changed, 292 insertions(+), 12 deletions(-) create mode 100644 archaeological_context_records/migrations/0054_auto_20190910_1324.py create mode 100644 archaeological_files/migrations/0022_auto_20190910_1324.py create mode 100644 archaeological_finds/migrations/0074_auto_20190910_1324.py create mode 100644 archaeological_operations/migrations/0066_auto_20190910_1323.py create mode 100644 archaeological_warehouse/migrations/0040_auto_20190910_1324.py create mode 100644 ishtar_common/migrations/0108_auto_20190910_1323.py diff --git a/archaeological_context_records/migrations/0054_auto_20190910_1324.py b/archaeological_context_records/migrations/0054_auto_20190910_1324.py new file mode 100644 index 000000000..4bcec8dfb --- /dev/null +++ b/archaeological_context_records/migrations/0054_auto_20190910_1324.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2019-09-10 13:24 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('archaeological_context_records', '0053_auto_20190910_1248'), + ] + + operations = [ + migrations.AddField( + model_name='contextrecord', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='historicalcontextrecord', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/archaeological_files/migrations/0022_auto_20190910_1324.py b/archaeological_files/migrations/0022_auto_20190910_1324.py new file mode 100644 index 000000000..f3f2e1a06 --- /dev/null +++ b/archaeological_files/migrations/0022_auto_20190910_1324.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2019-09-10 13:24 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('archaeological_files', '0021_auto_20190910_1248'), + ] + + operations = [ + migrations.AddField( + model_name='file', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='historicalfile', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/archaeological_finds/migrations/0074_auto_20190910_1324.py b/archaeological_finds/migrations/0074_auto_20190910_1324.py new file mode 100644 index 000000000..1ae637940 --- /dev/null +++ b/archaeological_finds/migrations/0074_auto_20190910_1324.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2019-09-10 13:24 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('archaeological_finds', '0073_auto_20190910_1248'), + ] + + operations = [ + migrations.AddField( + model_name='basefind', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='find', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='historicalbasefind', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='historicalfind', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='historicaltreatment', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='historicaltreatmentfile', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='property', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='treatment', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='treatmentfile', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + ] diff --git a/archaeological_operations/migrations/0066_auto_20190910_1323.py b/archaeological_operations/migrations/0066_auto_20190910_1323.py new file mode 100644 index 000000000..488a35986 --- /dev/null +++ b/archaeological_operations/migrations/0066_auto_20190910_1323.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2019-09-10 13:23 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('archaeological_operations', '0065_auto_20190910_1248'), + ] + + operations = [ + migrations.AddField( + model_name='administrativeact', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='archaeologicalsite', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='historicaladministrativeact', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='historicalarchaeologicalsite', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='historicaloperation', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='operation', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='parcel', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='parcelowner', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + ] diff --git a/archaeological_warehouse/migrations/0040_auto_20190910_1324.py b/archaeological_warehouse/migrations/0040_auto_20190910_1324.py new file mode 100644 index 000000000..8264ccb1d --- /dev/null +++ b/archaeological_warehouse/migrations/0040_auto_20190910_1324.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2019-09-10 13:24 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('archaeological_warehouse', '0039_auto_20190910_1248'), + ] + + operations = [ + migrations.AddField( + model_name='collection', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='container', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='warehouse', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + ] diff --git a/ishtar_common/migrations/0108_auto_20190910_1323.py b/ishtar_common/migrations/0108_auto_20190910_1323.py new file mode 100644 index 000000000..ef7e16ba3 --- /dev/null +++ b/ishtar_common/migrations/0108_auto_20190910_1323.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2019-09-10 13:23 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('ishtar_common', '0107_auto_20190910_1248'), + ] + + operations = [ + migrations.AddField( + model_name='document', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='historicalorganization', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='historicalperson', + name='lock_user', + field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='organization', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + migrations.AddField( + model_name='person', + name='lock_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Locked by'), + ), + ] diff --git a/ishtar_common/models.py b/ishtar_common/models.py index e83f26640..bc9e68c02 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -2097,6 +2097,9 @@ class BaseHistorizedItem(StatisticItem, TemplateItem, FullSearch, Imported, verbose_name=_("Need update"), default=False) locked = models.BooleanField( verbose_name=_("Item locked for edition"), default=False) + lock_user = models.ForeignKey( + User, related_name='+', on_delete=models.SET_NULL, + verbose_name=_("Locked by"), blank=True, null=True) ALT_NAMES = { 'history_creator': SearchAltName( diff --git a/ishtar_common/templates/ishtar/sheet.html b/ishtar_common/templates/ishtar/sheet.html index 0dda760b8..5676a4419 100644 --- a/ishtar_common/templates/ishtar/sheet.html +++ b/ishtar_common/templates/ishtar/sheet.html @@ -119,6 +119,16 @@ {% endblock %} {% endif %}
+ {% if item.locked %} + + {% endif %} {% block content %} {% endblock %}
diff --git a/ishtar_common/templatetags/link_to_window.py b/ishtar_common/templatetags/link_to_window.py index 610c5d017..86a1978de 100644 --- a/ishtar_common/templatetags/link_to_window.py +++ b/ishtar_common/templatetags/link_to_window.py @@ -12,11 +12,14 @@ register = Library() def simple_link_to_window(item): if not hasattr(item, 'SLUG'): return "" + lock = "" + if getattr(item, "locked", None): + lock = ' ' return mark_safe( u' ' - u''.format( - reverse("show-" + item.SLUG, args=[item.pk, '']))) + u'{}'.format( + reverse("show-" + item.SLUG, args=[item.pk, '']), lock)) @register.filter diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index 62aff2e81..2c4cc1a55 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -1146,6 +1146,8 @@ def _get_data_from_query(items, query_table_cols, extra_request_keys, items = items.annotate(point_x=exp_x) items = items.annotate(point_y=exp_y) values += ['point_x', 'point_y'] + if hasattr(items.model, "locked"): + values.append("locked") data_list = items.values_list(*values) return data_list @@ -1838,17 +1840,22 @@ def get_item(model, func_name, default_name, extra_request_keys=None, if sign == '-': datas = reversed(datas) datas = list(datas)[start:end] - link_template = "" \ - "" - link_ext_template = '{}' + link_template = \ + "" \ + "" + link_ext_template = '' + lock = ' ' + has_locks = hasattr(model, "locked") if data_type.startswith("json"): rows = [] if data_type == 'json-map': - - lnk = link_template % reverse('show-' + default_name, - args=[999999, '']) + lnk = link_template.format( + reverse('show-' + default_name, args=[999999, '']), + ) lnk = lnk.replace('999999', "") + if not has_locks: + lnk = lnk.replace('', "") data = json.dumps(_format_geojson(datas, lnk)) return HttpResponse(data, content_type='application/json') for data in datas: @@ -1858,8 +1865,12 @@ def get_item(model, func_name, default_name, extra_request_keys=None, if not no_link: try: lnk_template = link_template - lnk = lnk_template % reverse('show-' + default_name, - args=[data[0], '']) + lnk = lnk_template.format( + reverse('show-' + default_name, args=[data[0], ''])) + if has_locks and data[-1]: + lnk = lnk.replace('', lock) + else: + lnk = lnk.replace('', "") except NoReverseMatch: logger.warning( '**WARN "show-' + default_name + '" args (' @@ -1867,7 +1878,7 @@ def get_item(model, func_name, default_name, extra_request_keys=None, lnk = '' res["link"] = lnk for idx, value in enumerate(data[1:]): - if not value: + if not value or idx >= len(table_cols): continue table_col = table_cols[idx] if type(table_col) not in (list, tuple): -- cgit v1.2.3