diff options
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r-- | ishtar_common/models.py | 73 |
1 files changed, 66 insertions, 7 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 24b64bec0..20b85e614 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -22,6 +22,7 @@ Models description """ from cStringIO import StringIO import copy +import csv import datetime from PIL import Image from importlib import import_module @@ -33,6 +34,7 @@ import unicodecsv from django.conf import settings from django.core.cache import cache from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.core.files import File from django.core.files.uploadedfile import SimpleUploadedFile from django.core.validators import validate_slug from django.core.urlresolvers import reverse, NoReverseMatch @@ -51,11 +53,12 @@ from django.contrib import admin from simple_history.models import HistoricalRecords as BaseHistoricalRecords +from ishtar_common.unicode_csv import UnicodeWriter from ishtar_common.ooo_replace import ooo_replace from ishtar_common.model_merging import merge_model_objects from ishtar_common.utils import get_cache -from ishtar_common.data_importer import Importer, ImportFormater, IntegerFormater, \ - FloatFormater, UnicodeFormater, DateFormater, TypeFormater +from ishtar_common.data_importer import Importer, ImportFormater, \ + IntegerFormater, FloatFormater, UnicodeFormater, DateFormater, TypeFormater def post_save_user(sender, **kwargs): user = kwargs['instance'] @@ -388,7 +391,7 @@ class GeneralType(models.Model): self.add_key(key) def get_keys(self): - keys = [] + keys = [self.txt_idx] content_type = ContentType.objects.get_for_model(self.__class__) for ik in ItemKey.objects.filter(content_type=content_type, object_id=self.pk).all(): @@ -1168,7 +1171,8 @@ class ImportTarget(models.Model): self.target.split('__')) def get_choices(self): - if not self.associated_model or not hasattr(self.associated_model, 'get_types'): + if not self.associated_model or not hasattr(self.associated_model, + 'get_types'): return [] return self.associated_model.get_types() @@ -1179,8 +1183,8 @@ class TargetKey(models.Model): them in ItemKey table """ target = models.ForeignKey(ImportTarget, related_name='keys') - key = models.TextField(_(u"Key"), blank=True, null=True) - value = models.TextField(_(u"Value")) + key = models.TextField(_(u"Key")) + value = models.TextField(_(u"Value"), blank=True, null=True) is_set = models.BooleanField(_(u"Is set"), default=False) class Meta: @@ -1189,6 +1193,29 @@ class TargetKey(models.Model): def __unicode__(self): return u" - ".join([unicode(self.target), self.key[:50]]) + def save(self, *args, **kwargs): + obj = super(TargetKey, self).save(*args, **kwargs) + if not self.value: + return obj + associated_model = self.target.associated_model + if associated_model and hasattr(self.target.associated_model, + "add_key"): + v = None + # pk is given + try: + pk = int(self.value) + v = self.target.associated_model.objects.get( + pk=unicode(self.value)) + except (ValueError, self.target.associated_model.DoesNotExist): + # try with txt_idx + try: + v = self.target.associated_model.objects.get( + txt_idx=unicode(self.value)) + except (self.target.associated_model.DoesNotExist): + pass + if v: + v.add_key(self.key) + return obj TARGET_MODELS = [ ('OrganizationType', _(u"Organization type")), ('SourceType', _(u"Source type")), @@ -1279,7 +1306,10 @@ IMPORT_STATE = (("C", _(u"Created")), ("A", _(u"Analysed")), ("P", _(u"Import pending")), ("IP", _(u"Import in progress")), - ("F", _(u"Finished"))) + ("FE", _(u"Finished with errors")), + ("F", _(u"Finished")), + ("AC", _(u"Archived")), + ) IMPORT_STATE_DCT = dict(IMPORT_STATE) @@ -1325,6 +1355,8 @@ class Import(models.Model): if self.state == 'A': actions.append(('A', _(u"Re-analyse"))) actions.append(('I', _(u"Launch import"))) + if self.state in ('F', 'FE'): + actions.append(('AC', _(u"Archive"))) actions.append(('D', _(u"Delete"))) return actions @@ -1363,6 +1395,33 @@ class Import(models.Model): self.state = 'A' self.save() + def importation(self): + self.state = 'IP' + self.save() + importer = self.get_importer_instance() + importer.importation(self.data_table) + if importer.errors: + self.state = 'FE' + error_file = None + + filename = slugify(self.importer_type.name) + ".csv" + now = datetime.datetime.now().isoformat('-' + ).replace(':','') + error_file = '.'.join(filename.split('.')[:-1]) \ + + "_errors_%s.csv" % now + error_file = os.sep.join([self.error_file.storage.location, + error_file]) + with open(error_file, 'w') as fle: + fle.write(importer.get_csv_errors().encode('utf-8')) + self.error_file = File(open(fle.name)) + else: + self.state = 'F' + self.save() + + def archive(self): + self.state = 'AC' + self.save() + class Organization(Address, Merge, OwnPerms, ValueGetter): TABLE_COLS = ('name', 'organization_type',) name = models.CharField(_(u"Name"), max_length=300) |