diff options
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r-- | ishtar_common/views.py | 179 |
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")) |