diff options
Diffstat (limited to 'ishtar_common/views.py')
| -rw-r--r-- | ishtar_common/views.py | 127 | 
1 files changed, 72 insertions, 55 deletions
| diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 5786391cc..2feb49bc0 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -23,7 +23,11 @@ from copy import copy  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 @@ -186,10 +190,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 +221,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): @@ -462,7 +469,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 +500,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 +516,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 +534,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 +563,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 +574,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): @@ -585,6 +592,23 @@ HIERARCHIC_FIELDS = ['periods', 'period', 'unit', 'material_types',                       'material_type', 'conservatory_state'] +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=[],               base_request=None, bool_fields=[], reversed_bool_fields=[],               dated_fields=[], associated_models=[], relative_session_names=[], @@ -607,7 +631,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 @@ -683,7 +707,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: @@ -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: @@ -1231,7 +1248,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: @@ -1286,7 +1303,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) @@ -1301,7 +1318,7 @@ def show_item(model, name, extra_dct=None):              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: @@ -1321,8 +1338,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 +1350,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 +1369,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 +1391,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): | 
