diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-09-10 13:38:42 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2019-09-10 13:38:42 +0200 |
commit | 1d5254416b11ef1010d5ac31f2a53677254c6497 (patch) | |
tree | a445b831d1646d990d8ed2c194f047fa9f4724e7 | |
parent | 1c0fc5949bd107086a50fe326b7645e362687598 (diff) | |
download | Ishtar-1d5254416b11ef1010d5ac31f2a53677254c6497.tar.bz2 Ishtar-1d5254416b11ef1010d5ac31f2a53677254c6497.zip |
Locks: lock_user in model - display lock icon on tables, links - add a warning on sheet
-rw-r--r-- | archaeological_context_records/migrations/0054_auto_20190910_1324.py | 28 | ||||
-rw-r--r-- | archaeological_files/migrations/0022_auto_20190910_1324.py | 28 | ||||
-rw-r--r-- | archaeological_finds/migrations/0074_auto_20190910_1324.py | 63 | ||||
-rw-r--r-- | archaeological_operations/migrations/0066_auto_20190910_1323.py | 58 | ||||
-rw-r--r-- | archaeological_warehouse/migrations/0040_auto_20190910_1324.py | 33 | ||||
-rw-r--r-- | ishtar_common/migrations/0108_auto_20190910_1323.py | 43 | ||||
-rw-r--r-- | ishtar_common/models.py | 3 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/sheet.html | 10 | ||||
-rw-r--r-- | ishtar_common/templatetags/link_to_window.py | 7 | ||||
-rw-r--r-- | ishtar_common/views_item.py | 31 |
10 files changed, 292 insertions, 12 deletions
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 %} <div class="body"> + {% if item.locked %} + <div class="alert alert-warning" role="alert"> + <i class="fa fa-lock text-danger" aria-hidden="true"></i> + {% if item.lock_user %}{% blocktrans with locker=item.lock_user.ishtaruser %} + This item has been locked by {{locker}}. Edition is disabled. + {% endblocktrans %}{% else %} + {% trans "This item has been locked. Edition is disabled." %} + {% endif %} + </div> + {% endif %} {% block content %} {% endblock %} </div> 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 = ' <i class="fa fa-lock text-danger" aria-hidden="true"></i>' return mark_safe( u' <a class="display_details" href="#" ' u'onclick="load_window(\'{}\')">' - u'<i class="fa fa-info-circle" aria-hidden="true"></i></a>'.format( - reverse("show-" + item.SLUG, args=[item.pk, '']))) + u'<i class="fa fa-info-circle" aria-hidden="true"></i>{}</a>'.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 = "<a class='display_details' href='#' " \ - "onclick='load_window(\"%s\")'>" \ - "<i class=\"fa fa-info-circle\" aria-hidden=\"true\"></i></a>" - link_ext_template = '<a href="{}" target="_blank">{}</a>' + link_template = \ + "<a class='display_details' href='#' " \ + "onclick='load_window(\"{}\")'>" \ + "<i class=\"fa fa-info-circle\" aria-hidden=\"true\"></i><lock></a>" + link_ext_template = '<a href="{}" target="_blank"></a>' + lock = ' <i class="fa fa-lock text-danger" aria-hidden="true"></i>' + 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', "<pk>") + if not has_locks: + lnk = lnk.replace('<lock>', "") 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>', lock) + else: + lnk = lnk.replace('<lock>', "") 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): |