summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2017-02-17 21:09:09 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2017-02-17 21:09:09 +0100
commitad3ebfed01a7bb3844349b6c00e64377bde4055b (patch)
tree121a4e7a25b8302fa4412a6066565f86dfd4733f /ishtar_common/models.py
parente2a45e2db75ec6960d458ea08004becaf429d2f6 (diff)
parentc37bb6ecce45fccc1f0c9d321a785ffeeefc3366 (diff)
downloadIshtar-ad3ebfed01a7bb3844349b6c00e64377bde4055b.tar.bz2
Ishtar-ad3ebfed01a7bb3844349b6c00e64377bde4055b.zip
Merge branch 'master' into v0.9
Conflicts: ishtar_common/migrations/0030_auto__add_state__chg_field_sourcetype_txt_idx__chg_field_authortype_tx.py
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py65
1 files changed, 45 insertions, 20 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 90e2bd6f6..2496e4372 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
@@ -72,17 +73,18 @@ logger = logging.getLogger(__name__)
def post_save_user(sender, **kwargs):
user = kwargs['instance']
+
try:
q = IshtarUser.objects.filter(username=user.username)
if not q.count():
ishtaruser = IshtarUser.create_from_user(user)
else:
ishtaruser = q.all()[0]
- ADMINISTRATOR, created = PersonType.objects.get_or_create(
+ administrator, created = PersonType.objects.get_or_create(
txt_idx='administrator')
if ishtaruser.is_superuser \
and not ishtaruser.has_right('administrator'):
- ishtaruser.person.person_types.add(ADMINISTRATOR)
+ ishtaruser.person.person_types.add(administrator)
except DatabaseError: # manage when db is not synced
pass
post_save.connect(post_save_user, sender=User)
@@ -648,27 +650,34 @@ class GeneralType(Cached, models.Model):
self.generate_key(force=True)
return obj
- def add_key(self, key, force=False):
+ def add_key(self, key, force=False, importer=None):
content_type = ContentType.objects.get_for_model(self.__class__)
- if not force and ItemKey.objects.filter(
+ if not importer and not force and ItemKey.objects.filter(
key=key, content_type=content_type).count():
return
if force:
- ItemKey.objects.filter(key=key, content_type=content_type)\
+ ItemKey.objects.filter(key=key, content_type=content_type,
+ importer=importer)\
.exclude(object_id=self.pk).delete()
- ItemKey.objects.get_or_create(object_id=self.pk, key=key,
- content_type=content_type)
+ ItemKey.objects.get_or_create(
+ object_id=self.pk, key=key, content_type=content_type,
+ importer=importer
+ )
def generate_key(self, force=False):
for key in (slugify(self.label), self.txt_idx):
self.add_key(key)
- def get_keys(self):
+ def get_keys(self, importer_id=None):
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).exclude(
- key=self.txt_idx).all():
+ query = Q(content_type=content_type, object_id=self.pk,
+ importer__isnull=True)
+ if importer_id:
+ query |= Q(content_type=content_type, object_id=self.pk,
+ importer__pk=importer_id)
+ q = ItemKey.objects.filter(query)
+ for ik in q.exclude(key=self.txt_idx).all():
keys.append(ik.key)
return keys
@@ -1782,7 +1791,7 @@ class ImporterType(models.Model):
def __unicode__(self):
return self.name
- def get_importer_class(self):
+ def get_importer_class(self, import_instance=None):
if self.slug and self.slug in IMPORTER_CLASSES:
cls = import_class(IMPORTER_CLASSES[self.slug])
return cls
@@ -1805,7 +1814,8 @@ class ImporterType(models.Model):
force_news = []
concat_str = []
for target in column.targets.all():
- ft = target.formater_type.get_formater_type(target)
+ ft = target.formater_type.get_formater_type(
+ target, import_instance=import_instance)
if not ft:
continue
formater_types.append(ft)
@@ -2106,10 +2116,10 @@ class TargetKey(models.Model):
try:
v = self.target.associated_model.objects.get(
txt_idx=unicode(self.value))
- except (self.target.associated_model.DoesNotExist):
+ except self.target.associated_model.DoesNotExist:
pass
if v:
- v.add_key(self.key)
+ v.add_key(self.key, importer=self.associated_import)
return obj
TARGET_MODELS = [
@@ -2203,10 +2213,10 @@ class FormaterType(models.Model):
if self.format_type in IMPORTER_TYPES_CHOICES:
return IMPORTER_TYPES_CHOICES[self.format_type]
- def get_formater_type(self, target):
+ def get_formater_type(self, target, import_instance=None):
if self.formater_type not in IMPORTER_TYPES_DCT.keys():
return
- kwargs = {'db_target': target}
+ kwargs = {'db_target': target, 'import_instance': import_instance}
if self.many_split:
kwargs['many_split'] = self.many_split
if self.formater_type == 'TypeFormater':
@@ -2302,6 +2312,19 @@ class Import(models.Model):
return bool(TargetKey.objects.filter(associated_import=self,
is_set=False).count())
+ @property
+ def errors(self):
+ if not self.error_file:
+ return []
+ errors = []
+ with open(self.error_file.path, 'rb') as csvfile:
+ reader = csv.DictReader(csvfile, fieldnames=['line', 'column',
+ 'error'])
+ reader.next() # pass the header
+ for row in reader:
+ errors.append(row)
+ return errors
+
def get_actions(self):
"""
Get available action relevant with the current status
@@ -2332,7 +2355,7 @@ class Import(models.Model):
return IMPORT_STATE_DCT[self.state]
def get_importer_instance(self):
- return self.importer_type.get_importer_class()(
+ return self.importer_type.get_importer_class(import_instance=self)(
skip_lines=self.skip_lines, import_instance=self,
conservative_import=self.conservative_import)
@@ -2783,8 +2806,10 @@ class IshtarUser(User):
name=name, email=email,
history_modifier=user)
person.person_types.add(person_type)
- return IshtarUser.objects.create(user_ptr=user, username=default,
- person=person)
+ password = user.password
+ isht_user = IshtarUser.objects.create(
+ user_ptr=user, username=default, person=person, password=password)
+ return isht_user
def has_right(self, right_name, session=None):
return self.person.has_right(right_name, session=session)