diff options
| -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', | 
