summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archaeological_context_records/migrations/0031_auto_20181017_1642.py36
-rw-r--r--archaeological_files/migrations/0014_auto_20181017_1642.py36
-rw-r--r--archaeological_finds/forms.py4
-rw-r--r--archaeological_finds/migrations/0035_auto_20181017_1642.py72
-rw-r--r--archaeological_finds/models_finds.py11
-rw-r--r--archaeological_operations/migrations/0038_auto_20181017_1642.py67
-rw-r--r--archaeological_warehouse/migrations/0023_auto_20181017_1642.py41
-rw-r--r--ishtar_common/forms.py26
-rw-r--r--ishtar_common/migrations/0073_auto_20181017_1642.py44
-rw-r--r--ishtar_common/models.py1
-rw-r--r--ishtar_common/urls.py2
-rw-r--r--ishtar_common/utils_migrations.py22
-rw-r--r--ishtar_common/views.py24
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',