summaryrefslogtreecommitdiff
path: root/ishtar_common/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r--ishtar_common/views.py179
1 files changed, 172 insertions, 7 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index eed175753..e4b55cae2 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -52,7 +52,8 @@ from archaeological_finds.forms import DashboardTreatmentForm, \
DashboardTreatmentFileForm
from archaeological_finds.models import Find, Treatment, TreatmentFile
from archaeological_operations.forms import DashboardForm as DashboardFormOpe
-from archaeological_operations.models import Operation
+from archaeological_operations.models import Operation, ArchaeologicalSite
+from archaeological_warehouse.models import Warehouse
from ishtar_common import forms_common as forms
from ishtar_common import wizards
from ishtar_common.forms import FinalForm, FinalDeleteForm
@@ -62,8 +63,8 @@ from ishtar_common.utils import clean_session_cache, CSV_OPTIONS, \
get_field_labels_from_path, get_random_item_image_link, shortify
from ishtar_common.widgets import JQueryAutoComplete
-from views_item import CURRENT_ITEM_KEYS, check_permission, display_item, \
- get_item, new_item, show_item
+from views_item import CURRENT_ITEM_KEYS, CURRENT_ITEM_KEYS_DICT, \
+ check_permission, display_item, get_item, new_item, show_item
logger = logging.getLogger(__name__)
@@ -250,8 +251,12 @@ def shortcut_menu(request):
if profile.files:
CURRENT_ITEMS.append((_(u"Archaeological file"), File))
CURRENT_ITEMS.append((_(u"Operation"), Operation))
+ if profile.archaeological_site:
+ CURRENT_ITEMS.append((profile.get_site_label(), ArchaeologicalSite))
if profile.context_record:
CURRENT_ITEMS.append((_(u"Context record"), ContextRecord))
+ if profile.warehouse:
+ CURRENT_ITEMS.append((_(u"Warehouse"), Warehouse))
if profile.find:
CURRENT_ITEMS.append((_(u"Find"), Find))
if profile.warehouse:
@@ -323,7 +328,7 @@ def shortcut_menu(request):
continue
current_items.append(pk)
selected = pk == current
- item_label = shortify(item['cached_label'], 60)
+ item_label = shortify(item[lbl_key], 60)
if selected:
cls = shortmenu_class
new_selected_item = pk
@@ -365,8 +370,7 @@ def get_current_items(request):
def unpin(request, item_type):
- if item_type not in ('find', 'contextrecord', 'operation', 'file',
- 'treatment', 'treatmentfile'):
+ if item_type not in CURRENT_ITEM_KEYS_DICT.keys():
logger.warning("unpin unknow type: {}".format(item_type))
return HttpResponse('nok')
request.session['treatment'] = ''
@@ -378,9 +382,15 @@ def unpin(request, item_type):
request.session['find'] = ''
if item_type == 'find':
return HttpResponse('ok')
+ request.session['warehouse'] = ''
+ if item_type == 'warehouse':
+ return HttpResponse('ok')
request.session['contextrecord'] = ''
if item_type == 'contextrecord':
return HttpResponse('ok')
+ request.session['site'] = ''
+ if item_type == 'site':
+ return HttpResponse('ok')
request.session['operation'] = ''
if item_type == 'operation':
return HttpResponse('ok')
@@ -401,16 +411,19 @@ def update_current_item(request, item_type=None, pk=None):
request.session['SHORTCUT_SEARCH'] = 'all'
currents = get_current_items(request)
+
# re-init when descending item are not relevant
if item_type == 'file' and currents['file'] and currents['operation'] and \
currents['operation'].associated_file != currents['file']:
request.session["operation"] = ''
currents['operation'] = None
+
if item_type in ('operation', 'file') and currents['contextrecord'] and \
(not request.session.get("operation", None) or
currents['contextrecord'].operation != currents['operation']):
request.session["contextrecord"] = ''
currents['contextrecord'] = None
+
from archaeological_finds.models import Find
if item_type in ('contextrecord', 'operation', 'file') and \
currents['find'] and \
@@ -472,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',
@@ -1757,10 +1794,47 @@ class BookmarkList(SearchQueryMixin, JSONResponseMixin, LoginRequiredMixin,
)
return {
'bookmarks': [
- {'label': sq.label, 'query': sq.query} for sq in q.all()]
+ {'label': sq.label, 'query': sq.query,
+ 'id': sq.id} for sq in q.all()]
}
+class SearchQueryDelete(LoginRequiredMixin, DeleteView):
+ model = models.SearchQuery
+ template_name = 'ishtar/forms/bookmark_delete.html'
+ page_name = _(u"Delete bookmark")
+
+ def dispatch(self, request, *args, **kwargs):
+ if not request.user.pk:
+ raise Http404()
+ try:
+ self.profile = models.UserProfile.objects.get(
+ current=True, person__ishtaruser__user_ptr=request.user)
+ except models.UserProfile.DoesNotExist:
+ # no current profile
+ raise Http404()
+ try:
+ self.search_query = models.SearchQuery.objects.get(
+ profile=self.profile,
+ pk=kwargs['pk']
+ )
+ except models.SearchQuery.DoesNotExist:
+ raise Http404()
+ return super(SearchQueryDelete, self).dispatch(request, *args, **kwargs)
+
+ def get_context_data(self, **kwargs):
+ data = super(SearchQueryDelete, self).get_context_data(**kwargs)
+ data['modal_size'] = "small"
+ data['page_name'] = _(u"Bookmark - Delete")
+ data['action_name'] = _(u"Delete")
+ data['item'] = self.search_query.label
+ data['url'] = reverse('bookmark-delete', args=[self.search_query.pk])
+ return data
+
+ def get_success_url(self):
+ return reverse('success', args=['bookmark'])
+
+
class AlertList(JSONResponseMixin, LoginRequiredMixin,
TemplateView):
def dispatch(self, request, *args, **kwargs):
@@ -1795,3 +1869,94 @@ class AlertList(JSONResponseMixin, LoginRequiredMixin,
'number': nb}
)
return {'alerts': alerts}
+
+
+class QAItemForm(IshtarMixin, LoginRequiredMixin, FormView):
+ template_name = 'ishtar/forms/qa_form.html'
+ model = None
+ form_class = None
+ page_name = u""
+ success_url = "/success/"
+ modal_size = None # large, small or None (medium)
+
+ def get_quick_action(self):
+ raise NotImplementedError()
+
+ def dispatch(self, request, *args, **kwargs):
+ assert self.model
+ pks = [int(pk) for pk in kwargs.get('pks').split('-')]
+ self.items = list(self.model.objects.filter(pk__in=pks))
+ if not self.items:
+ raise Http404()
+
+ # check availability
+ quick_action = self.get_quick_action()
+ if not quick_action.is_available(
+ user=request.user, session=request.session):
+ for item in self.items:
+ if not quick_action.is_available(
+ user=request.user, session=request.session, obj=item):
+ raise Http404()
+
+ self.url = request.get_full_path()
+ return super(QAItemForm, self).dispatch(request, *args, **kwargs)
+
+ def get_form_kwargs(self):
+ kwargs = super(QAItemForm, self).get_form_kwargs()
+ kwargs['items'] = self.items
+ return kwargs
+
+ def get_context_data(self, **kwargs):
+ data = super(QAItemForm, self).get_context_data(**kwargs)
+ data['url'] = self.url
+ data['items'] = self.items
+ data['modal_size'] = self.modal_size
+ data['page_name'] = u"{} – {}".format(
+ self.model._meta.verbose_name, self.page_name)
+ return data
+
+
+class QAItemEditForm(QAItemForm):
+ form_class_multi = None
+ modal_size = "large"
+
+ def get_quick_action(self):
+ return self.model.QA_EDIT
+
+ def dispatch(self, request, *args, **kwargs):
+ self.confirm = kwargs.get('confirm', False) and True
+ returned = super(QAItemEditForm, self).dispatch(request, *args,
+ **kwargs)
+ return returned
+
+ def get_form_class(self):
+ if len(self.items) > 1 and self.form_class_multi:
+ return self.form_class_multi
+ return self.form_class
+
+ def get_form_kwargs(self):
+ kwargs = super(QAItemEditForm, self).get_form_kwargs()
+ kwargs['confirm'] = self.confirm
+ return kwargs
+
+ def get_context_data(self, **kwargs):
+ data = super(QAItemEditForm, self).get_context_data(**kwargs)
+ data['page_name'] = u"{} – {}".format(
+ self.model._meta.verbose_name, self.model.QA_EDIT.text)
+ if self.confirm:
+ if 'confirm' not in self.url:
+ data['url'] = self.url.split('?')[0] + "confirm/"
+ data['confirm'] = True
+ data['action_name'] = _(u"Confirm")
+ return data
+
+ def form_valid(self, form):
+ if not self.confirm:
+ self.confirm = True
+ return self.render_to_response(
+ self.get_context_data(form=self.get_form()))
+ return self.form_save(form)
+
+ def form_save(self, form):
+ form.save(self.items, self.request.user)
+ return HttpResponseRedirect(reverse("success"))