diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-10-17 17:33:30 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2018-10-24 12:06:09 +0200 |
commit | 12677a8856f7503e908d965ca2034c6afccda838 (patch) | |
tree | c8c33449dc1ad25f195839068fa1fdd6125931ec | |
parent | dddba4f6f64680a047d99292f8acf65ae57238cf (diff) | |
download | Ishtar-12677a8856f7503e908d965ca2034c6afccda838.tar.bz2 Ishtar-12677a8856f7503e908d965ca2034c6afccda838.zip |
Find: search last modified and modified by
-rw-r--r-- | archaeological_context_records/migrations/0031_auto_20181017_1642.py | 36 | ||||
-rw-r--r-- | archaeological_files/migrations/0014_auto_20181017_1642.py | 36 | ||||
-rw-r--r-- | archaeological_finds/forms.py | 4 | ||||
-rw-r--r-- | archaeological_finds/migrations/0035_auto_20181017_1642.py | 72 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 11 | ||||
-rw-r--r-- | archaeological_operations/migrations/0038_auto_20181017_1642.py | 67 | ||||
-rw-r--r-- | archaeological_warehouse/migrations/0023_auto_20181017_1642.py | 41 | ||||
-rw-r--r-- | ishtar_common/forms.py | 26 | ||||
-rw-r--r-- | ishtar_common/migrations/0073_auto_20181017_1642.py | 44 | ||||
-rw-r--r-- | ishtar_common/models.py | 1 | ||||
-rw-r--r-- | ishtar_common/urls.py | 2 | ||||
-rw-r--r-- | ishtar_common/utils_migrations.py | 22 | ||||
-rw-r--r-- | ishtar_common/views.py | 24 |
13 files changed, 384 insertions, 2 deletions
diff --git a/archaeological_context_records/migrations/0031_auto_20181017_1642.py b/archaeological_context_records/migrations/0031_auto_20181017_1642.py new file mode 100644 index 000000000..4ba07813b --- /dev/null +++ b/archaeological_context_records/migrations/0031_auto_20181017_1642.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-10-17 16:42 +from __future__ import unicode_literals + +from django.db import migrations, models +import virtualtime + +from ishtar_common.utils_migrations import reinit_last_modified + + +def migrate_codes(apps, schema_editor): + models = ['contextrecord'] + reinit_last_modified( + apps, 'archaeological_context_records', models + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_context_records', '0030_auto_20180619_0911'), + ] + + operations = [ + migrations.AddField( + model_name='contextrecord', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='historicalcontextrecord', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.RunPython(migrate_codes) + ] diff --git a/archaeological_files/migrations/0014_auto_20181017_1642.py b/archaeological_files/migrations/0014_auto_20181017_1642.py new file mode 100644 index 000000000..a5868c692 --- /dev/null +++ b/archaeological_files/migrations/0014_auto_20181017_1642.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-10-17 16:42 +from __future__ import unicode_literals + +from django.db import migrations, models +import virtualtime + +from ishtar_common.utils_migrations import reinit_last_modified + + +def migrate_codes(apps, schema_editor): + models = ['File'] + reinit_last_modified( + apps, 'archaeological_files', models + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_files', '0013_file_documents'), + ] + + operations = [ + migrations.AddField( + model_name='file', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='historicalfile', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.RunPython(migrate_codes) + ] diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py index cf08e1a19..610c309d0 100644 --- a/archaeological_finds/forms.py +++ b/archaeological_finds/forms.py @@ -52,7 +52,7 @@ from bootstrap_datepicker.widgets import DatePicker from ishtar_common import widgets from ishtar_common.forms import CustomForm, CustomFormSearch, FormSet, \ FloatField, reverse_lazy, TableSelect, get_now, FinalForm, \ - ManageOldType, FieldType, IshtarForm, FormHeader, QAForm + ManageOldType, FieldType, IshtarForm, FormHeader, QAForm, HistorySelect from ishtar_common.forms_common import get_town_field from ishtar_common.models import valid_id, valid_ids, get_current_profile, \ SpatialReferenceSystem, Area, OperationType @@ -585,7 +585,7 @@ DatingFormSet.form_admin_name = _(u"Find - 040 - Dating") DatingFormSet.form_slug = "find-040-dating" -class FindSelect(CustomForm, TableSelect): +class FindSelect(HistorySelect): _model = models.Find form_admin_name = _(u"Find - 001 - Search") diff --git a/archaeological_finds/migrations/0035_auto_20181017_1642.py b/archaeological_finds/migrations/0035_auto_20181017_1642.py new file mode 100644 index 000000000..d8515bdb5 --- /dev/null +++ b/archaeological_finds/migrations/0035_auto_20181017_1642.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-10-17 16:42 +from __future__ import unicode_literals + +from django.db import migrations, models +import virtualtime + +from ishtar_common.utils_migrations import reinit_last_modified + + +def migrate_codes(apps, schema_editor): + models = ['Find', 'BaseFind', 'Property', 'Treatment', 'TreatmentFile', + 'Property'] + reinit_last_modified( + apps, 'archaeological_finds', models + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_finds', '0034_auto_20180814_1133'), + ] + + operations = [ + migrations.AddField( + model_name='basefind', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='find', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='historicalbasefind', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='historicalfind', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='historicaltreatment', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='historicaltreatmentfile', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='property', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='treatment', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='treatmentfile', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.RunPython(migrate_codes) + ] diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 26993aa32..3a1d44f36 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -680,6 +680,8 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms, 'cr_relation_types': 'base_finds__context_record__', } + + DATED_FIELDS = ['last_modified__gte'] BASE_REQUEST = {'downstream_treatment__isnull': True} EXTRA_REQUEST_KEYS = { 'base_finds__context_record': @@ -860,6 +862,15 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms, pgettext_lazy("key for text search", u"operation"), 'base_finds__context_record__operation__cached_label__icontains' ), + 'history_modifier': ( + pgettext_lazy("key for text search", u"last-modified-by"), + 'history_modifier__ishtaruser__person__cached_label__icontains' + ), + 'modified_since': ( + pgettext_lazy("key for text search", u"modified-since"), + 'last_modified__gte' + + ), } for v in ALT_NAMES.values(): for language_code, language_lbl in settings.LANGUAGES: diff --git a/archaeological_operations/migrations/0038_auto_20181017_1642.py b/archaeological_operations/migrations/0038_auto_20181017_1642.py new file mode 100644 index 000000000..88a4e4e7f --- /dev/null +++ b/archaeological_operations/migrations/0038_auto_20181017_1642.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-10-17 16:42 +from __future__ import unicode_literals + +from django.db import migrations, models +import virtualtime + +from ishtar_common.utils_migrations import reinit_last_modified + + +def migrate_codes(apps, schema_editor): + models = ['AdministrativeAct', 'ArchaeologicalSite', 'Operation', + 'Parcel', 'ParcelOwner'] + reinit_last_modified( + apps, 'archaeological_operations', models + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_operations', '0037_auto_20180903_1015'), + ] + + operations = [ + migrations.AddField( + model_name='administrativeact', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='archaeologicalsite', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='historicaladministrativeact', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='historicalarchaeologicalsite', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='historicaloperation', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='operation', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='parcel', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='parcelowner', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.RunPython(migrate_codes) + ] diff --git a/archaeological_warehouse/migrations/0023_auto_20181017_1642.py b/archaeological_warehouse/migrations/0023_auto_20181017_1642.py new file mode 100644 index 000000000..340b1911e --- /dev/null +++ b/archaeological_warehouse/migrations/0023_auto_20181017_1642.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-10-17 16:42 +from __future__ import unicode_literals + +from django.db import migrations, models +import virtualtime + +from ishtar_common.utils_migrations import reinit_last_modified + + +def migrate_codes(apps, schema_editor): + models = ['Warehouse', 'Container', 'Collection'] + reinit_last_modified( + apps, 'archaeological_warehouse', models + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('archaeological_warehouse', '0022_container_cached_division'), + ] + + operations = [ + migrations.AddField( + model_name='collection', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='container', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='warehouse', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.RunPython(migrate_codes) + ] diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index 34a50c0dd..7fed8b1c2 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -26,6 +26,7 @@ import re import types from django import forms +from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.core.urlresolvers import reverse from django.core import validators @@ -512,6 +513,31 @@ class TableSelect(IshtarForm): return self.fields.keys() +class HistorySelect(CustomForm, TableSelect): + history_modifier = forms.IntegerField( + label=_(u"Last modified by"), + widget=widgets.JQueryAutoComplete( + reverse_lazy('autocomplete-user'), + associated_model=User), required=False + ) + modified_since = forms.DateField( + label=_(u"Modified since"), widget=DatePicker, + required=False) + + def __init__(self, *args, **kwargs): + super(HistorySelect, self).__init__(*args, **kwargs) + field_order = self.fields.keys() + current_fields = ["history_modifier", "modified_since"] + fields = OrderedDict() + for k in field_order: + if k in current_fields: + continue + fields[k] = self.fields[k] + for k in current_fields: + fields[k] = self.fields[k] + self.fields = fields + + def get_now(): format = formats.get_format('DATE_INPUT_FORMATS')[0] value = datetime.datetime.now().strftime(format) diff --git a/ishtar_common/migrations/0073_auto_20181017_1642.py b/ishtar_common/migrations/0073_auto_20181017_1642.py new file mode 100644 index 000000000..42e905b2c --- /dev/null +++ b/ishtar_common/migrations/0073_auto_20181017_1642.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.10 on 2018-10-17 16:42 +from __future__ import unicode_literals + +from django.db import migrations, models +import virtualtime + +from ishtar_common.utils_migrations import reinit_last_modified + + +def migrate_codes(apps, schema_editor): + models = ['Person', 'Organization'] + reinit_last_modified(apps, 'ishtar_common', models) + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0072_auto_20181008_1117'), + ] + + operations = [ + migrations.AddField( + model_name='historicalorganization', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='historicalperson', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='organization', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.AddField( + model_name='person', + name='last_modified', + field=models.DateTimeField(default=virtualtime.virtual_datetime.now), + ), + migrations.RunPython(migrate_codes) + ] diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 3e7cecf2a..c19628cf2 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1413,6 +1413,7 @@ class BaseHistorizedItem(DocumentItem, FullSearch, Imported, JsonData, history_creator = models.ForeignKey( User, related_name='+', on_delete=models.SET_NULL, verbose_name=_(u"Creator"), blank=True, null=True) + last_modified = models.DateTimeField(default=datetime.datetime.now) class Meta: abstract = True diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 91b527959..57241dd57 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -170,6 +170,8 @@ urlpatterns += [ url(r'new-person-noorga/' r'(?:(?P<parent_name>[^/]+)/)?(?:(?P<limits>[^/]+)/)?$', views.new_person_noorga, name='new-person-noorga'), + url(r'autocomplete-user/$', + views.autocomplete_user, name='autocomplete-user'), url(r'autocomplete-person(?:/([0-9_]+))?(?:/([0-9_]*))?/(user)?$', views.autocomplete_person, name='autocomplete-person'), url(r'autocomplete-person-permissive(?:/([0-9_]+))?(?:/([0-9_]*))?' diff --git a/ishtar_common/utils_migrations.py b/ishtar_common/utils_migrations.py index 48e9e4f9b..40cdcb5cd 100644 --- a/ishtar_common/utils_migrations.py +++ b/ishtar_common/utils_migrations.py @@ -75,3 +75,25 @@ def migrate_sources(apps, base_model, source_model, item_attr): doc.authors.add(author) item = base_model.objects.get(pk=getattr(source, item_attr).pk) item.documents.add(doc) + + +def reinit_last_modified(apps, app_name, models): + for model_name in models: + model = apps.get_model(app_name, model_name) + try: + historical_model = apps.get_model( + app_name, 'Historical' + model_name) + except: + continue + for item in model.objects.all(): + q = historical_model.objects.filter( + id=item.pk).order_by('-history_date') + if not q.count(): + return + edit_date = q.all()[0].history_date + if not edit_date: + return + item.last_modified = edit_date + item.skip_history_when_saving = True + item.save() + diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 55b5fce1e..e4b55cae2 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -485,6 +485,30 @@ def autocomplete_person_permissive(request, person_types=None, is_ishtar_user=is_ishtar_user, permissive=True) +def autocomplete_user(request): + if not request.user.has_perm('ishtar_common.view_person', models.Person): + return HttpResponse('[]', content_type='text/plain') + q = request.GET.get('term') + limit = request.GET.get('limit', 20) + try: + limit = int(limit) + except ValueError: + return HttpResponseBadRequest() + query = Q() + for q in q.split(' '): + qu = (Q(ishtaruser__person__name__icontains=q) | + Q(ishtaruser__person__surname__icontains=q) | + Q(first_name__icontains=q) | + Q(last_name__icontains=q)) + query = query & qu + users = models.User.objects.filter(query)[:limit] + data = json.dumps([ + {'id': user.pk, + 'value': unicode(user.ishtaruser)} + for user in users if user and user.ishtaruser]) + return HttpResponse(data, content_type='text/plain') + + def autocomplete_person(request, person_types=None, attached_to=None, is_ishtar_user=None, permissive=False): all_items = request.user.has_perm('ishtar_common.view_person', |