diff options
Diffstat (limited to 'ishtar_common/views.py')
| -rw-r--r-- | ishtar_common/views.py | 219 | 
1 files changed, 118 insertions, 101 deletions
| diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 234dcd826..997acd7df 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -19,11 +19,15 @@  from tidylib import tidy_document as tidy -from copy import copy +from copy import copy, deepcopy  import csv  import cStringIO as StringIO  import datetime + +import reportlab +reportlab.Version = "2.2"  # stupid hack for an old library...  import ho.pisa as pisa +  import json  import logging  from markdown import markdown @@ -44,8 +48,8 @@ from django.db.models.fields import FieldDoesNotExist  from django.forms.models import modelformset_factory  from django.http import HttpResponse, Http404, HttpResponseRedirect, \      HttpResponseBadRequest -from django.shortcuts import render_to_response, redirect -from django.template import RequestContext, loader +from django.shortcuts import redirect, render +from django.template import loader  from django.utils.decorators import method_decorator  from django.utils.translation import ugettext, ugettext_lazy as _  from django.views.generic import ListView, UpdateView, TemplateView @@ -68,7 +72,8 @@ from archaeological_finds.forms import DashboardTreatmentForm, \  from ishtar_common.forms import FinalForm, FinalDeleteForm  from ishtar_common.widgets import JQueryAutoComplete -from ishtar_common.utils import get_random_item_image_link, shortify +from ishtar_common.utils import get_random_item_image_link, shortify, \ +    get_all_field_names  from ishtar_common import forms_common as forms  from ishtar_common import wizards  from ishtar_common.models import HistoryError, PRIVATE_FIELDS, \ @@ -109,13 +114,11 @@ def index(request):      else:          dct['random_image'] = image      try: -        return render_to_response('index.html', dct, -                                  context_instance=RequestContext(request)) +        return render(request, 'index.html', dct)      except NoReverseMatch:          # probably rights exception (rights revoked)          logout(request) -        return render_to_response('index.html', dct, -                                  context_instance=RequestContext(request)) +        return render(request, 'index.html', dct)  person_search_wizard = wizards.SearchWizard.as_view(      [('general-person_search', forms.PersonFormSelection)], @@ -186,10 +189,13 @@ organization_deletion_wizard = wizards.OrganizationDeletionWizard.as_view(      label=_(u"Organization deletion"),      url_name='organization_deletion',) +account_wizard_steps = [ +    ('selec-account_management', forms.PersonUserFormSelection), +    ('account-account_management', forms.AccountForm), +    ('final-account_management', forms.FinalAccountForm)] +  account_management_wizard = wizards.AccountWizard.as_view( -    [('selec-account_management', forms.PersonUserFormSelection), -     ('account-account_management', forms.AccountForm), -     ('final-account_management', forms.FinalAccountForm)], +    account_wizard_steps,      label=_(u"Account management"),      url_name='account_management',) @@ -214,44 +220,44 @@ def get_autocomplete_generic(model, extra={'available': True}):              else unicode(x)          data = json.dumps([{'id': obj.pk, 'value': get_label(obj)}                             for obj in objects]) -        return HttpResponse(data, mimetype='text/plain') +        return HttpResponse(data, content_type='text/plain')      return func  def hide_shortcut_menu(request):      request.session['SHORTCUT_SHOW'] = 'off' -    return HttpResponse('OK', mimetype='text/plain') +    return HttpResponse('OK', content_type='text/plain')  def show_shortcut_menu(request):      request.session['SHORTCUT_SHOW'] = 'on' -    return HttpResponse('OK', mimetype='text/plain') +    return HttpResponse('OK', content_type='text/plain')  def activate_all_search(request):      request.session['SHORTCUT_SEARCH'] = 'all' -    return HttpResponse('OK', mimetype='text/plain') +    return HttpResponse('OK', content_type='text/plain')  def activate_own_search(request):      request.session['SHORTCUT_SEARCH'] = 'own' -    return HttpResponse('OK', mimetype='text/plain') +    return HttpResponse('OK', content_type='text/plain')  def activate_advanced_shortcut_menu(request):      if not hasattr(request.user, 'ishtaruser'): -        return HttpResponse('KO', mimetype='text/plain') +        return HttpResponse('KO', content_type='text/plain')      request.user.ishtaruser.advanced_shortcut_menu = True      request.user.ishtaruser.save() -    return HttpResponse('OK', mimetype='text/plain') +    return HttpResponse('OK', content_type='text/plain')  def activate_simple_shortcut_menu(request):      if not hasattr(request.user, 'ishtaruser'): -        return HttpResponse('KO', mimetype='text/plain') +        return HttpResponse('KO', content_type='text/plain')      request.user.ishtaruser.advanced_shortcut_menu = False      request.user.ishtaruser.save() -    return HttpResponse('OK', mimetype='text/plain') +    return HttpResponse('OK', content_type='text/plain')  def shortcut_menu(request): @@ -288,9 +294,9 @@ def shortcut_menu(request):                      model).render(                          model.SLUG + '-shortcut', value=current,                          attrs={'id': 'current_' + model.SLUG}))) -        return render_to_response( -            'ishtar/blocks/advanced_shortcut_menu.html', -            dct, context_instance=RequestContext(request)) +        return render( +            request, 'ishtar/blocks/advanced_shortcut_menu.html', dct +        )      dct = {          'current_menu': [],          'SHORTCUT_SHOW': request.session['SHORTCUT_SHOW'] @@ -333,8 +339,7 @@ def shortcut_menu(request):              dct['current_menu'].append((lbl, model_name, cls, items))          if new_selected_item:              current_selected_item[model_name] = new_selected_item -    return render_to_response('ishtar/blocks/shortcut_menu.html', dct, -                              context_instance=RequestContext(request)) +    return render(request, 'ishtar/blocks/shortcut_menu.html', dct)  CURRENT_ITEM_KEYS = (('file', File),                       ('operation', Operation), @@ -352,7 +357,7 @@ def get_current_items(request):          if key in request.session and request.session[key]:              try:                  currents[key] = model.objects.get(pk=int(request.session[key])) -            except (ValueError, File.DoesNotExist): +            except (ValueError, model.DoesNotExist):                  continue      return currents @@ -462,7 +467,7 @@ def autocomplete_person(request, person_types=None, attached_to=None,          own_items = request.user.has_perm('ishtar_common.view_own_person',                                            models.Person)      if not all_items and not own_items or not request.GET.get('term'): -        return HttpResponse('[]', mimetype='text/plain') +        return HttpResponse('[]', content_type='text/plain')      q = request.GET.get('term')      limit = request.GET.get('limit', 20)      try: @@ -493,12 +498,12 @@ def autocomplete_person(request, person_types=None, attached_to=None,      persons = models.Person.objects.filter(query)[:limit]      data = json.dumps([{'id': person.pk, 'value': unicode(person)}                         for person in persons if person]) -    return HttpResponse(data, mimetype='text/plain') +    return HttpResponse(data, content_type='text/plain')  def autocomplete_department(request):      if not request.GET.get('term'): -        return HttpResponse('[]', mimetype='text/plain') +        return HttpResponse('[]', content_type='text/plain')      q = request.GET.get('term')      q = unicodedata.normalize("NFKD", q).encode('ascii', 'ignore')      query = Q() @@ -509,12 +514,12 @@ def autocomplete_department(request):      departments = models.Department.objects.filter(query)[:limit]      data = json.dumps([{'id': department.pk, 'value': unicode(department)}                         for department in departments]) -    return HttpResponse(data, mimetype='text/plain') +    return HttpResponse(data, content_type='text/plain')  def autocomplete_town(request):      if not request.GET.get('term'): -        return HttpResponse(mimetype='text/plain') +        return HttpResponse(content_type='text/plain')      q = request.GET.get('term')      q = unicodedata.normalize("NFKD", q).encode('ascii', 'ignore')      query = Q() @@ -527,12 +532,12 @@ def autocomplete_town(request):      towns = models.Town.objects.filter(query)[:limit]      data = json.dumps([{'id': town.pk, 'value': unicode(town)}                         for town in towns]) -    return HttpResponse(data, mimetype='text/plain') +    return HttpResponse(data, content_type='text/plain')  def autocomplete_advanced_town(request, department_id=None, state_id=None):      if not request.GET.get('term'): -        return HttpResponse(mimetype='text/plain') +        return HttpResponse(content_type='text/plain')      q = request.GET.get('term')      q = unicodedata.normalize("NFKD", q).encode('ascii', 'ignore')      query = Q() @@ -556,7 +561,7 @@ def autocomplete_advanced_town(request, department_id=None, state_id=None):              val += " (%s)" % town.numero_insee          result.append({'id': town.pk, 'value': val})      data = json.dumps(result) -    return HttpResponse(data, mimetype='text/plain') +    return HttpResponse(data, content_type='text/plain')  def department_by_state(request, state_id=''): @@ -567,7 +572,7 @@ def department_by_state(request, state_id=''):          data = json.dumps([{'id': department.pk, 'number': department.number,                              'value': unicode(department)}                             for department in departments]) -    return HttpResponse(data, mimetype='text/plain') +    return HttpResponse(data, content_type='text/plain')  def format_val(val): @@ -582,7 +587,24 @@ def format_val(val):  HIERARCHIC_LEVELS = 5  HIERARCHIC_FIELDS = ['periods', 'period', 'unit', 'material_types', -                     'material_type', 'conservatory_state'] +                     'material_type', 'conservatory_state', 'object_types'] + + +def _get_values(request, val): +    if hasattr(val, 'all'):  # manage related objects +        vals = list(val.all()) +    else: +        vals = [val] +    new_vals = [] +    for v in vals: +        if callable(v): +            v = v() +        if hasattr(v, 'url'): +            v = request.is_secure() and \ +                'https' or 'http' + '://' + \ +                           request.get_host() + v.url +        new_vals.append(v) +    return new_vals  def get_item(model, func_name, default_name, extra_request_keys=[], @@ -607,7 +629,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          allowed, own = models.check_model_access_control(request, model,                                                           available_perms)          if not allowed: -            return HttpResponse(EMPTY, mimetype='text/plain') +            return HttpResponse(EMPTY, content_type='text/plain')          if force_own:              own = True @@ -653,8 +675,9 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          else:              my_relation_types_prefix = copy(relation_types_prefix) -        fields = [model._meta.get_field_by_name(k)[0] -                  for k in model._meta.get_all_field_names()] +        fields = [model._meta.get_field(k) +                  for k in get_all_field_names(model)] +          request_keys = dict([              (field.name,               field.name + (hasattr(field, 'rel') and field.rel and '__pk' @@ -666,8 +689,8 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                      continue                  associated_model = globals()[associated_model]              associated_fields = [ -                associated_model._meta.get_field_by_name(k)[0] -                for k in associated_model._meta.get_all_field_names()] +                associated_model._meta.get_field(k) +                for k in get_all_field_names(associated_model)]              request_keys.update(                  dict([(key + "__" + field.name,                         key + "__" + field.name + @@ -683,7 +706,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],          try:              old = 'old' in request_items and int(request_items['old'])          except ValueError: -            return HttpResponse('[]', mimetype='text/plain') +            return HttpResponse('[]', content_type='text/plain')          # manage relations types          if 'relation_types' not in my_relation_types_prefix: @@ -711,6 +734,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                  q = Q(**{req_key: val})                  reqs |= q              and_reqs.append(reqs) +          pinned_search = ""          if 'submited' not in request_items and full != 'shortcut':              # default search @@ -730,7 +754,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                      try:                          dct = {"pk": request.session[default_name]}                          pinned_search = unicode(model._meta.verbose_name)\ -                            + u" - " +  unicode( +                            + u" - " + unicode(                                  model.objects.get(pk=dct["pk"]))                      except model.DoesNotExist:                          pass @@ -856,7 +880,11 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                  query |= Q(**altor_dct)          if own: -            query = query & model.get_query_owns(request.user) +            q = models.IshtarUser.objects.filter(user_ptr=request.user) +            if q.count(): +                query = query & model.get_query_owns(q.all()[0]) +            else: +                return HttpResponse(EMPTY, content_type='text/plain')          for and_req in and_reqs:              query = query & and_req @@ -1007,23 +1035,11 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                                  val = list(val.all())                                  for v in val:                                      v = getattr(v, ky) -                                    if callable(v): -                                        v = v() -                                    if hasattr(v, 'url'): -                                        v = request.is_secure() and \ -                                            'https' or 'http' + '://' + \ -                                            request.get_host() + v.url -                                    new_vals.append(v) +                                    new_vals += _get_values(request, v)                              elif val:                                  try:                                      val = getattr(val, ky) -                                    if callable(val): -                                        val = val() -                                    if hasattr(val, 'url'): -                                        val = request.is_secure() and \ -                                            'https' or 'http' + '://' + \ -                                            request.get_host() + val.url -                                    new_vals.append(val) +                                    new_vals += _get_values(request, val)                                  except AttributeError:                                      # must be a query key such as "contains"                                      pass @@ -1111,9 +1127,9 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                      "page": page_nb,                      "total": (items_nb / row_nb + 1) if row_nb else items_nb,                  }) -            return HttpResponse(data, mimetype='text/plain') +            return HttpResponse(data, content_type='text/plain')          elif data_type == "csv": -            response = HttpResponse(mimetype='text/csv') +            response = HttpResponse(content_type='text/csv')              n = datetime.datetime.now()              filename = u'%s_%s.csv' % (default_name,                                         n.strftime('%Y%m%d-%H%M%S')) @@ -1154,14 +1170,15 @@ def get_item(model, func_name, default_name, extra_request_keys=[],                      val = data[1:][idx + delta].encode(                          ENCODING, errors='replace')                      if col_name and "|" in col_name[0]: -                        for delta_idx in range(len(col_name[0].split('|')) - 1): +                        for delta_idx in range( +                                len(col_name[0].split('|')) - 1):                              delta += 1                              val += data[1:][idx + delta].encode(                                  ENCODING, errors='replace')                      row.append(val)                  writer.writerow(row)              return response -        return HttpResponse('{}', mimetype='text/plain') +        return HttpResponse('{}', content_type='text/plain')      return func @@ -1173,7 +1190,7 @@ def get_by_importer(request, slug, data_type='json', full=False,          res = ''          if data_type == "json":              res = '{}' -        return HttpResponse(res, mimetype='text/plain') +        return HttpResponse(res, content_type='text/plain')      imp = q.all()[0].get_importer_class()      cols, col_names = [], []      for formater in imp.LINE_FORMAT: @@ -1193,8 +1210,7 @@ def display_item(model, extra_dct=None, show_url=None):              dct['show_url'] = "/{}{}/".format(show_url, pk)          else:              dct['show_url'] = "/show-{}/{}/".format(model.SLUG, pk) -        return render_to_response('ishtar/display_item.html', dct, -                                  context_instance=RequestContext(request)) +        return render(request, 'ishtar/display_item.html', dct)      return func @@ -1231,7 +1247,7 @@ def show_item(model, name, extra_dct=None):                      item = item.get_previous(date=date)                      assert item is not None                  except (ValueError, AssertionError): -                    return HttpResponse(None, mimetype='text/plain') +                    return HttpResponse(None, content_type='text/plain')                  dct['previous'] = item._previous                  dct['next'] = item._next              else: @@ -1244,8 +1260,7 @@ def show_item(model, name, extra_dct=None):          # add context          if extra_dct:              dct.update(extra_dct(request, item)) -        context_instance = RequestContext(request) -        context_instance.update(dct) +        context_instance = deepcopy(dct)          context_instance['output'] = 'html'          if hasattr(item, 'history_object'):              filename = item.history_object.associated_filename @@ -1254,7 +1269,7 @@ def show_item(model, name, extra_dct=None):          if doc_type == "odt" and settings.ODT_TEMPLATE:              tpl = loader.get_template('ishtar/sheet_%s.html' % name)              context_instance['output'] = 'ODT' -            content = tpl.render(context_instance) +            content = tpl.render(context_instance, request)              try:                  tidy_options = {'output-xhtml': 1, 'indent': 1,                                  'tidy-mark': 0, 'doctype': 'auto', @@ -1286,7 +1301,7 @@ def show_item(model, name, extra_dct=None):              except xhtml2odt.ODTExportError:                  return HttpResponse(content, content_type="application/xhtml")              response = HttpResponse( -                mimetype='application/vnd.oasis.opendocument.text') +                content_type='application/vnd.oasis.opendocument.text')              response['Content-Disposition'] = 'attachment; filename=%s.odt' % \                                                filename              response.write(odtfile) @@ -1294,14 +1309,14 @@ def show_item(model, name, extra_dct=None):          elif doc_type == 'pdf':              tpl = loader.get_template('ishtar/sheet_%s_pdf.html' % name)              context_instance['output'] = 'PDF' -            content = tpl.render(context_instance) +            content = tpl.render(context_instance, request)              result = StringIO.StringIO()              html = content.encode('utf-8')              html = html.replace("<table", "<pdf:nextpage/><table repeat='1'")              pdf = pisa.pisaDocument(StringIO.StringIO(html), result,                                      encoding='utf-8')              response = HttpResponse(result.getvalue(), -                                    mimetype='application/pdf') +                                    content_type='application/pdf')              response['Content-Disposition'] = 'attachment; filename=%s.pdf' % \                                                filename              if not pdf.err: @@ -1309,7 +1324,7 @@ def show_item(model, name, extra_dct=None):              return HttpResponse(content, content_type="application/xhtml")          else:              tpl = loader.get_template('ishtar/sheet_%s_window.html' % name) -            content = tpl.render(context_instance) +            content = tpl.render(context_instance, request)              return HttpResponse(content, content_type="application/xhtml")      return func @@ -1321,8 +1336,8 @@ def revert_item(model):              date = datetime.datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%f')              item.rollback(date)          except (ObjectDoesNotExist, ValueError, HistoryError): -            return HttpResponse(None, mimetype='text/plain') -        return HttpResponse("True", mimetype='text/plain') +            return HttpResponse(None, content_type='text/plain') +        return HttpResponse("True", content_type='text/plain')      return func @@ -1333,9 +1348,9 @@ def autocomplete_organization(request, orga_type=None):                                    models.Organization)         and not request.user.ishtaruser.has_right(              'person_search', session=request.session)): -        return HttpResponse('[]', mimetype='text/plain') +        return HttpResponse('[]', content_type='text/plain')      if not request.GET.get('term'): -        return HttpResponse('[]', mimetype='text/plain') +        return HttpResponse('[]', content_type='text/plain')      q = request.GET.get('term')      query = Q()      for q in q.split(' '): @@ -1352,16 +1367,16 @@ def autocomplete_organization(request, orga_type=None):      organizations = models.Organization.objects.filter(query)[:limit]      data = json.dumps([{'id': org.pk, 'value': unicode(org)}                         for org in organizations]) -    return HttpResponse(data, mimetype='text/plain') +    return HttpResponse(data, content_type='text/plain')  def autocomplete_author(request):      if not request.user.has_perm('ishtar_common.view_author', models.Author)\         and not request.user.has_perm('ishtar_common.view_own_author',                                       models.Author): -        return HttpResponse('[]', mimetype='text/plain') +        return HttpResponse('[]', content_type='text/plain')      if not request.GET.get('term'): -        return HttpResponse('[]', mimetype='text/plain') +        return HttpResponse('[]', content_type='text/plain')      q = request.GET.get('term')      query = Q()      for q in q.split(' '): @@ -1374,7 +1389,7 @@ def autocomplete_author(request):      authors = models.Author.objects.filter(query)[:limit]      data = json.dumps([{'id': author.pk, 'value': unicode(author)}                         for author in authors]) -    return HttpResponse(data, mimetype='text/plain') +    return HttpResponse(data, content_type='text/plain')  def new_item(model, frm, many=False): @@ -1396,13 +1411,10 @@ def new_item(model, frm, many=False):                  if dct['parent_pk'] and '_select_' in dct['parent_pk']:                      parents = dct['parent_pk'].split('_')                      dct['parent_pk'] = "_".join([parents[0]] + parents[2:]) -                return render_to_response( -                    'window.html', dct, -                    context_instance=RequestContext(request)) +                return render(request, 'window.html', dct)          else:              dct['form'] = frm(limits=limits) -        return render_to_response('window.html', dct, -                                  context_instance=RequestContext(request)) +        return render(request, 'window.html', dct)      return func  new_person = new_item(models.Person, forms.PersonForm) @@ -1431,8 +1443,7 @@ def action(request, action_slug, obj_id=None, *args, **kwargs):      globals_dct = globals()      if action_slug in globals_dct:          return globals_dct[action_slug](request, dct, obj_id, *args, **kwargs) -    return render_to_response('index.html', dct, -                              context_instance=RequestContext(request)) +    return render(request, 'index.html', dct)  def dashboard_main(request, dct, obj_id=None, *args, **kwargs): @@ -1452,8 +1463,7 @@ def dashboard_main(request, dct, obj_id=None, *args, **kwargs):          app_list.append((_(u"Treatment requests"), 'treatmentfiles'))          app_list.append((_(u"Treatments"), 'treatments'))      dct = {'app_list': app_list} -    return render_to_response('ishtar/dashboards/dashboard_main.html', dct, -                              context_instance=RequestContext(request)) +    return render(request, 'ishtar/dashboards/dashboard_main.html', dct)  DASHBOARD_FORMS = {      'files': DashboardFormFile, 'operations': DashboardFormOpe, @@ -1468,9 +1478,8 @@ def dashboard_main_detail(request, item_name):      """      if item_name == 'users':          dct = {'ishtar_users': models.UserDashboard()} -        return render_to_response( -            'ishtar/dashboards/dashboard_main_detail_users.html', -            dct, context_instance=RequestContext(request)) +        return render( +            request, 'ishtar/dashboards/dashboard_main_detail_users.html', dct)      form = None      slicing, date_source, fltr, show_detail = 'year', None, {}, False      profile = models.get_current_profile() @@ -1534,8 +1543,7 @@ def dashboard_main_detail(request, item_name):      n = datetime.datetime.now()      dct['unique_id'] = dct['item_name'] + "_" + \          '%d_%d_%d' % (n.minute, n.second, n.microsecond) -    return render_to_response('ishtar/dashboards/dashboard_main_detail.html', -                              dct, context_instance=RequestContext(request)) +    return render(request, 'ishtar/dashboards/dashboard_main_detail.html', dct)  def reset_wizards(request): @@ -1587,9 +1595,7 @@ def merge_action(model, form, key):                  return redirect(reverse(current_url, kwargs={'page': page}))          else:              context['formset'] = FormSet(queryset=queryset) -        return render_to_response( -            'ishtar/merge_' + key + '.html', context, -            context_instance=RequestContext(request)) +        return render(request, 'ishtar/merge_' + key + '.html', context)      return merge @@ -1659,6 +1665,11 @@ class NewImportView(IshtarMixin, LoginRequiredMixin, CreateView):      def get_success_url(self):          return reverse('current_imports') +    def get_form_kwargs(self): +        kwargs = super(NewImportView, self).get_form_kwargs() +        kwargs['user'] = self.request.user +        return kwargs +      def form_valid(self, form):          user = models.IshtarUser.objects.get(pk=self.request.user.pk)          self.object = form.save(user=user) @@ -1698,7 +1709,7 @@ class ImportListView(IshtarMixin, LoginRequiredMixin, ListView):                  return HttpResponseRedirect(reverse('import_delete',                                                      kwargs={'pk': imprt.pk}))              elif action == 'A': -                imprt.initialize() +                imprt.initialize(user=self.request.user.ishtaruser)              elif action == 'I':                  imprt.importation()              elif action == 'AC': @@ -1719,18 +1730,24 @@ class ImportOldListView(ImportListView):  class ImportLinkView(IshtarMixin, LoginRequiredMixin, ModelFormSetView): -    template_name = 'ishtar/formset.html' +    template_name = 'ishtar/formset_import_match.html'      model = models.TargetKey      page_name = _(u"Link unmatched items")      extra = 0      form_class = forms.TargetKeyForm +    formset_class = forms.TargetKeyFormset + +    def get_formset_kwargs(self): +        kwargs = super(ImportLinkView, self).get_formset_kwargs() +        kwargs['user'] = self.request.user +        return kwargs      def get_queryset(self):          return self.model.objects.filter(              is_set=False, associated_import=self.kwargs['pk'])      def get_success_url(self): -        return reverse('current_imports') +        return reverse('import_link_unmatched', args=[self.kwargs['pk']])  class ImportDeleteView(IshtarMixin, LoginRequiredMixin, DeleteView): | 
