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")) | 
