def handle_uploaded_image(request, display_obj, model_name, image_type, current_image=None): ''' process the uploaded file and generate ImageRevision ''' try: form = UploadImageForm(request.POST, request.FILES) except IOError: # sometimes uploads misbehave. connection dropped ? error_text = 'Something went wrong with the upload. ' + \ 'Please <a href="' + request.path + '">try again</a>.' return render_error(request, error_text, redirect=False, is_safe=True) if not form.is_valid(): return _display_image_upload_form(request, form, display_obj, model_name, image_type) # process form image = form.cleaned_data['image'] if current_image: revision_lock = _get_revision_lock(current_image) if not revision_lock: return render_error( request, 'Cannot replace %s as it is already reserved.' % current_image.description()) # create OI records changeset = Changeset(indexer=request.user, state=states.OPEN, change_type=CTYPES['image']) changeset.save() if current_image: revision_lock.changeset = changeset revision_lock.save() revision = ImageRevision( changeset=changeset, content_type=ContentType.objects.get_for_model(display_obj), object_id=display_obj.id, type=ImageType.objects.get(name=image_type), marked=form.cleaned_data['marked']) if current_image: revision.image = current_image revision.is_replacement = True revision.previous_revision = current_image.revisions.get( next_revision=None, changeset__state=states.APPROVED, committed=True) revision.save() revision.image_file.save(str(revision.id) + '.jpg', content=File(image)) revision.changeset.submit(form.cleaned_data['comments']) return HttpResponseRedirect(urlresolvers.reverse('editing'))
def handle_uploaded_image(request, display_obj, model_name, image_type, current_image=None): ''' process the uploaded file and generate ImageRevision ''' try: form = UploadImageForm(request.POST, request.FILES) except IOError: # sometimes uploads misbehave. connection dropped ? error_text = 'Something went wrong with the upload. ' + \ 'Please <a href="' + request.path + '">try again</a>.' return render_error(request, error_text, redirect=False, is_safe=True) if not form.is_valid(): return _display_image_upload_form(request, form, display_obj, model_name, image_type) # process form image = form.cleaned_data['image'] if current_image: revision_lock = _get_revision_lock(current_image) if not revision_lock: return render_error( request, u'Cannot replace %s as it is already reserved.' % current_image.description()) # create OI records changeset = Changeset(indexer=request.user, state=states.OPEN, change_type=CTYPES['image']) changeset.save() if current_image: revision_lock.changeset = changeset revision_lock.save() revision = ImageRevision( changeset=changeset, content_type=ContentType.objects.get_for_model(display_obj), object_id=display_obj.id, type=ImageType.objects.get(name=image_type), marked=form.cleaned_data['marked']) if current_image: revision.image = current_image revision.is_replacement = True revision.previous_revision = current_image.revisions.get( next_revision=None, changeset__state=states.APPROVED, committed=True) revision.save() revision.image_file.save(str(revision.id) + '.jpg', content=File(image)) revision.changeset.submit(form.cleaned_data['comments']) return HttpResponseRedirect(urlresolvers.reverse('editing'))
def save(self, commit=True): instance = super(RuntimeCreatorSignatureRevisionForm, self).save(commit=commit) if instance.image_revision: instance.image_revision.changeset = revision.changeset instance.image_revision.object_id = instance.id content_type = ContentType.objects.get_for_model(instance) instance.image_revision.content_type = content_type if revision.source: image = revision.creator_signature.signature img_lock = _get_revision_lock(image, changeset=revision.changeset) if img_lock is None: raise IntegrityError("needed Image lock not possible") previous = image.revisions.filter( changeset__state=states.APPROVED).last() instance.image_revision.previous_revision = previous instance.image_revision.is_replacement = True instance.image_revision.image = image instance.image_revision.save() return instance
def upload_cover(request, cover_id=None, issue_id=None): """ Handles uploading of covers be it - first upload - replacement upload - variant upload """ # this cannot actually happen if cover_id and issue_id: raise ValueError # if cover_id is present it is a replacement upload if cover_id: cover = get_object_or_404(Cover, id=cover_id) issue = cover.issue # no cover_id, therefore upload a cover to an issue (first or variant) else: issue = get_object_or_404(Issue, id=issue_id) if not issue.can_have_cover(): return render_error( request, 'No covers for non-comics publications if the issue has less' ' than 10% indexed comics content.', redirect=False) cover = None # check if there is a pending issue deletion if IssueRevision.objects.filter(issue=issue, deleted=True, changeset__state__in=states.ACTIVE): revision = IssueRevision.objects.get( issue=issue, changeset__state__in=states.ACTIVE) return render_error( request, ('%s is <a href="%s">pending deletion</a>. Covers ' 'cannot be added or modified.') % (esc(issue), urlresolvers.reverse('compare', kwargs={'id': revision.changeset.id})), redirect=False, is_safe=True) # check if there is a pending change for the cover # if POST, get a lock if cover_id and request.method == 'POST': revision_lock = _get_revision_lock(cover) if not revision_lock: return render_error( request, 'Cannot replace %s as it is already reserved.' % cover.issue) # if GET, check for a lock elif cover_id and is_locked(cover): return render_error( request, ('There currently is a pending replacement for this cover of %s.') % (cover.issue), redirect=False, is_safe=True) else: revision_lock = None # current request is an upload if request.method == 'POST': return handle_uploaded_cover(request, cover, issue, revision_lock=revision_lock) # request is a GET for the form else: if 'oi_file_source' in request.session: vars = { 'source': request.session['oi_file_source'], 'remember_source': True } else: vars = None form = UploadScanForm(initial=vars) # display the form return _display_cover_upload_form(request, form, cover, issue)
def process_edited_gatefold_cover(request): ''' process the edited gatefold cover and generate CoverRevision ''' if request.method != 'POST': return render_error( request, 'This page may only be accessed through the proper form', redirect=False) form = GatefoldScanForm(request.POST) if not form.is_valid(): error_text = 'Error: Something went wrong in the file upload.' return render_error(request, error_text, redirect=False) cd = form.cleaned_data tmpdir = settings.MEDIA_ROOT + LOCAL_NEW_SCANS + 'tmp' scan_name = cd['scan_name'] tmp_name = os.path.join(tmpdir, scan_name) if 'discard' in request.POST: os.remove(tmp_name) return HttpResponseRedirect( urlresolvers.reverse('edit_covers', kwargs={'issue_id': cd['issue_id']})) # create OI records changeset = Changeset(indexer=request.user, state=states.OPEN, change_type=CTYPES['cover']) if cd['cover_id']: cover = get_object_or_404(Cover, id=cd['cover_id']) issue = cover.issue # check if there is a pending change for the cover revision_lock = _get_revision_lock(cover) if not revision_lock: return render_error( request, 'Cannot replace %s as it is already reserved.' % cover.issue) changeset.save() revision_lock.changeset = changeset revision_lock.save() revision = CoverRevision(changeset=changeset, issue=issue, cover=cover, file_source=cd['source'], marked=cd['marked'], is_replacement=True) # no cover_id, therefore upload a cover to an issue (first or variant) else: changeset.save() issue = get_object_or_404(Issue, id=cd['issue_id']) cover = None revision = CoverRevision(changeset=changeset, issue=issue, file_source=cd['source'], marked=cd['marked']) revision.save() scan_name = str(revision.id) + os.path.splitext(tmp_name)[1] upload_dir = settings.MEDIA_ROOT + LOCAL_NEW_SCANS + \ changeset.created.strftime('%B_%Y').lower() destination_name = os.path.join(upload_dir, scan_name) try: # essentially only needed at beginning of the month check_cover_dir(upload_dir) except IOError: changeset.delete() error_text = "Problem with file storage for uploaded " + \ "cover, please report an error." return render_error(request, error_text, redirect=False) shutil.move(tmp_name, destination_name) im = pyImage.open(destination_name) revision.is_wraparound = True # convert from scaled to real values width = cd['width'] height = cd['height'] left = cd['left'] top = cd['top'] revision.front_left = left revision.front_right = left + width revision.front_top = top revision.front_bottom = top + height revision.save() generate_sizes(revision, im) return finish_cover_revision(request, revision, cd)
def upload_cover(request, cover_id=None, issue_id=None): """ Handles uploading of covers be it - first upload - replacement upload - variant upload """ # this cannot actually happen if cover_id and issue_id: raise ValueError # if cover_id is present it is a replacement upload if cover_id: cover = get_object_or_404(Cover, id=cover_id) issue = cover.issue # no cover_id, therefore upload a cover to an issue (first or variant) else: issue = get_object_or_404(Issue, id=issue_id) if not issue.can_have_cover(): return render_error(request, 'No covers for non-comics publications if the issue has less' ' than 10% indexed comics content.', redirect=False) cover = None # check if there is a pending issue deletion if IssueRevision.objects.filter(issue=issue, deleted=True, changeset__state__in=states.ACTIVE): revision = IssueRevision.objects.get(issue=issue, changeset__state__in=states.ACTIVE) return render_error(request, ('%s is <a href="%s">pending deletion</a>. Covers ' 'cannot be added or modified.') % (esc(issue), urlresolvers.reverse('compare', kwargs={'id': revision.changeset.id})), redirect=False, is_safe=True) # check if there is a pending change for the cover # if POST, get a lock if cover_id and request.method == 'POST': revision_lock = _get_revision_lock(cover) if not revision_lock: return render_error( request, u'Cannot replace %s as it is already reserved.' % cover.issue) # if GET, check for a lock elif cover_id and is_locked(cover): return render_error( request, ('There currently is a pending replacement for this cover of %s.') % (cover.issue), redirect=False, is_safe=True) else: revision_lock = None # current request is an upload if request.method == 'POST': return handle_uploaded_cover(request, cover, issue, revision_lock=revision_lock) # request is a GET for the form else: if 'oi_file_source' in request.session: vars = {'source' : request.session['oi_file_source'], 'remember_source' : True} else: vars = None form = UploadScanForm(initial=vars) # display the form return _display_cover_upload_form(request, form, cover, issue)
def process_edited_gatefold_cover(request): ''' process the edited gatefold cover and generate CoverRevision ''' if request.method != 'POST': return render_error(request, 'This page may only be accessed through the proper form', redirect=False) form = GatefoldScanForm(request.POST) if not form.is_valid(): error_text = 'Error: Something went wrong in the file upload.' return render_error(request, error_text, redirect=False) cd = form.cleaned_data tmpdir = settings.MEDIA_ROOT + LOCAL_NEW_SCANS + 'tmp' scan_name = cd['scan_name'] tmp_name = os.path.join(tmpdir, scan_name) if 'discard' in request.POST: os.remove(tmp_name) return HttpResponseRedirect(urlresolvers.reverse('edit_covers', kwargs={'issue_id': cd['issue_id']} )) # create OI records changeset = Changeset(indexer=request.user, state=states.OPEN, change_type=CTYPES['cover']) if cd['cover_id']: cover = get_object_or_404(Cover, id=cd['cover_id']) issue = cover.issue # check if there is a pending change for the cover revision_lock = _get_revision_lock(cover) if not revision_lock: return render_error( request, u'Cannot replace %s as it is already reserved.' % cover.issue) changeset.save() revision_lock.changeset = changeset revision_lock.save() revision = CoverRevision(changeset=changeset, issue=issue, cover=cover, file_source=cd['source'], marked=cd['marked'], is_replacement = True) # no cover_id, therefore upload a cover to an issue (first or variant) else: changeset.save() issue = get_object_or_404(Issue, id=cd['issue_id']) cover = None revision = CoverRevision(changeset=changeset, issue=issue, file_source=cd['source'], marked=cd['marked']) revision.save() scan_name = str(revision.id) + os.path.splitext(tmp_name)[1] upload_dir = settings.MEDIA_ROOT + LOCAL_NEW_SCANS + \ changeset.created.strftime('%B_%Y').lower() destination_name = os.path.join(upload_dir, scan_name) try: # essentially only needed at beginning of the month check_cover_dir(upload_dir) except IOError: changeset.delete() error_text = "Problem with file storage for uploaded " + \ "cover, please report an error." return render_error(request, error_text, redirect=False) shutil.move(tmp_name, destination_name) im = pyImage.open(destination_name) revision.is_wraparound = True # convert from scaled to real values width = cd['width'] height = cd['height'] left = cd['left'] top = cd['top'] revision.front_left = left revision.front_right = left + width revision.front_top = top revision.front_bottom = top + height revision.save() generate_sizes(revision, im) return finish_cover_revision(request, revision, cd)