X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/d69fc5f16ed739c02685e7d695abf6de59c2bf5e..4bb3e264dc9d9953c6a1ffcb0290a2ba0e0c094b:/apps/picture/models.py diff --git a/apps/picture/models.py b/apps/picture/models.py index 42a26c3c5..ee2b4e001 100644 --- a/apps/picture/models.py +++ b/apps/picture/models.py @@ -72,7 +72,7 @@ class Picture(models.Model): Picture resource. """ - title = models.CharField(_('title'), max_length=120) + title = models.CharField(_('title'), max_length=32767) slug = models.SlugField(_('slug'), max_length=120, db_index=True, unique=True) sort_key = models.CharField(_('sort key'), max_length=120, db_index=True, editable=False) sort_key_author = models.CharField(_('sort key by author'), max_length=120, db_index=True, editable=False, default=u'') @@ -108,7 +108,7 @@ class Picture(models.Model): def save(self, force_insert=False, force_update=False, **kwargs): from sortify import sortify - self.sort_key = sortify(self.title) + self.sort_key = sortify(self.title)[:120] try: author = self.tags.filter(category='author')[0].sort_key @@ -156,7 +156,7 @@ class Picture(models.Model): image_store = ImageStore(picture_storage.path('images')) picture_xml = WLPicture.from_file(xml_file, image_store=image_store) - picture, created = Picture.objects.get_or_create(slug=picture_xml.slug) + picture, created = Picture.objects.get_or_create(slug=picture_xml.slug[:120]) if not created and not overwrite: raise Picture.AlreadyExists('Picture %s already exists' % picture_xml.slug) @@ -170,42 +170,49 @@ class Picture(models.Model): area_data = {'themes':{}, 'things':{}} + # Treat all names in picture XML as in default language. + lang = settings.LANGUAGE_CODE + for part in picture_xml.partiter(): if picture_xml.frame: c = picture_xml.frame[0] part['coords'] = [[p[0] - c[0], p[1] - c[1]] for p in part['coords']] if part.get('object', None) is not None: - objname = part['object'] - tag, created = catalogue.models.Tag.objects.get_or_create(slug=slughifi(objname), category='thing') - if created: - tag.name = objname - tag.sort_key = sortify(tag.name) - tag.save() - #thing_tags.add(tag) - area_data['things'][tag.slug] = { - 'object': part['object'], - 'coords': part['coords'], - } - area = PictureArea.rectangle(picture, 'thing', part['coords']) - area.save() _tags = set() - _tags.add(tag) - area.tags = _tags - else: - _tags = set() - for motif in part['themes']: - tag, created = catalogue.models.Tag.objects.get_or_create(slug=slughifi(motif), category='theme') + for objname in part['object'].split(','): + objname = objname.strip().capitalize() + tag, created = catalogue.models.Tag.objects.get_or_create(slug=slughifi(objname), category='thing') if created: - tag.name = motif + tag.name = objname + setattr(tag, 'name_%s' % lang, tag.name) tag.sort_key = sortify(tag.name) tag.save() - #motif_tags.add(tag) - _tags.add(tag) - area_data['themes'][tag.slug] = { - 'theme': motif, - 'coords': part['coords'] + #thing_tags.add(tag) + area_data['things'][tag.slug] = { + 'object': objname, + 'coords': part['coords'], } + _tags.add(tag) + area = PictureArea.rectangle(picture, 'thing', part['coords']) + area.save() + area.tags = _tags + else: + _tags = set() + for motifs in part['themes']: + for motif in motifs.split(','): + tag, created = catalogue.models.Tag.objects.get_or_create(slug=slughifi(motif), category='theme') + if created: + tag.name = motif + tag.sort_key = sortify(tag.name) + tag.save() + #motif_tags.add(tag) + _tags.add(tag) + area_data['themes'][tag.slug] = { + 'theme': motif, + 'coords': part['coords'] + } + logging.debug("coords for theme: %s" % part['coords']) area = PictureArea.rectangle(picture, 'theme', part['coords']) area.save() @@ -225,7 +232,7 @@ class Picture(models.Model): picture.width, picture.height = modified.size modified_file = StringIO() - modified.save(modified_file, format='png', quality=95) + modified.save(modified_file, format='JPEG', quality=95) # FIXME: hardcoded extension - detect from DC format or orginal filename picture.image_file.save(path.basename(picture_xml.image_path), File(modified_file)) @@ -251,7 +258,7 @@ class Picture(models.Model): @classmethod def crop_to_frame(cls, wlpic, image_file): img = Image.open(image_file) - if wlpic.frame is None: + if wlpic.frame is None or wlpic.frame == [[0, 0], [-1, -1]]: return img img = img.crop(itertools.chain(*wlpic.frame)) return img @@ -266,14 +273,14 @@ class Picture(models.Model): (255, 255, 255) ) annotated.paste(img, (0, 0)) - annotation = Image.new(img.mode, (3000, 120), (255, 255, 255)) + annotation = Image.new('RGB', (img.size[0] * 3, 120), (255, 255, 255)) ImageDraw.Draw(annotation).text( (30, 15), wlpic.picture_info.source_name, (0, 0, 0), font=ImageFont.truetype(get_resource("fonts/DejaVuSerif.ttf"), 75) ) - annotated.paste(annotation.resize((1000, 40), Image.ANTIALIAS), (0, img.size[1])) + annotated.paste(annotation.resize((img.size[0], 40), Image.ANTIALIAS), (0, img.size[1])) return annotated @classmethod @@ -337,6 +344,7 @@ class Picture(models.Model): template % (self.pk, lang) for template in [ '/katalog/p/%d/short.%s.html', + '/katalog/p/%d/mini.%s.html', ] for lang in languages ])