summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py73
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)