def create(self, filediff=None): """Create a FileAttachment based on this form. Args: filediff (reviewboard.diffviewer.models.FileDiff, optional): The optional diff to attach this file to (for use when this file represents a binary file within the diff). Returns: reviewboard.attachments.models.FileAttachment: The new file attachment model. """ file_obj = self.files["path"] caption = self.cleaned_data["caption"] or file_obj.name mimetype = get_uploaded_file_mimetype(file_obj) filename = get_unique_filename(file_obj.name) if self.cleaned_data["attachment_history"] is None: # This is a new file: create a new FileAttachmentHistory for it attachment_history = FileAttachmentHistory() attachment_revision = 1 attachment_history.display_position = FileAttachmentHistory.compute_next_display_position( self.review_request ) attachment_history.save() self.review_request.file_attachment_histories.add(attachment_history) else: attachment_history = self.cleaned_data["attachment_history"] try: latest = attachment_history.file_attachments.latest() except FileAttachment.DoesNotExist: latest = None if latest is None: # This should theoretically never happen, but who knows. attachment_revision = 1 elif latest.review_request.exists(): # This is a new update in the draft. attachment_revision = latest.attachment_revision + 1 else: # The most recent revision is part of the same draft. Delete it # and replace with the newly uploaded file. attachment_revision = latest.attachment_revision latest.delete() attachment_kwargs = { "attachment_history": attachment_history, "attachment_revision": attachment_revision, "caption": "", "draft_caption": caption, "orig_filename": os.path.basename(file_obj.name), "mimetype": mimetype, } if filediff: file_attachment = FileAttachment.objects.create_from_filediff(filediff, save=False, **attachment_kwargs) else: file_attachment = FileAttachment(**attachment_kwargs) file_attachment.file.save(filename, file_obj, save=True) draft = ReviewRequestDraft.create(self.review_request) draft.file_attachments.add(file_attachment) draft.save() return file_attachment
def create(self, filediff=None): """Create a FileAttachment based on this form. Args: filediff (reviewboard.diffviewer.models.filediff.FileDiff, optional): The optional diff to attach this file to (for use when this file represents a binary file within the diff). Returns: reviewboard.attachments.models.FileAttachment: The new file attachment model. """ file_obj = self.files['path'] caption = self.cleaned_data['caption'] or file_obj.name mimetype = get_uploaded_file_mimetype(file_obj) filename = get_unique_filename(file_obj.name) if self.cleaned_data['attachment_history'] is None: # This is a new file: create a new FileAttachmentHistory for it attachment_history = FileAttachmentHistory() attachment_revision = 1 attachment_history.display_position = \ FileAttachmentHistory.compute_next_display_position( self.review_request) attachment_history.save() self.review_request.file_attachment_histories.add( attachment_history) else: attachment_history = self.cleaned_data['attachment_history'] try: latest = attachment_history.file_attachments.latest() except FileAttachment.DoesNotExist: latest = None if latest is None: # This should theoretically never happen, but who knows. attachment_revision = 1 elif latest.review_request.exists(): # This is a new update in the draft. attachment_revision = latest.attachment_revision + 1 else: # The most recent revision is part of the same draft. Delete it # and replace with the newly uploaded file. attachment_revision = latest.attachment_revision latest.delete() attachment_kwargs = { 'attachment_history': attachment_history, 'attachment_revision': attachment_revision, 'caption': '', 'draft_caption': caption, 'orig_filename': os.path.basename(file_obj.name), 'mimetype': mimetype, } if filediff: file_attachment = FileAttachment.objects.create_from_filediff( filediff, save=False, **attachment_kwargs) else: file_attachment = FileAttachment(**attachment_kwargs) file_attachment.file.save(filename, file_obj, save=True) draft = ReviewRequestDraft.create(self.review_request) draft.file_attachments.add(file_attachment) draft.save() return file_attachment
def create(self, filediff=None): file = self.files['path'] caption = self.cleaned_data['caption'] or file.name # There are several things that can go wrong with browser-provided # mimetypes. In one case (bug 3427), Firefox on Linux Mint was # providing a mimetype that looked like 'text/text/application/pdf', # which is unparseable. IE also has a habit of setting any unknown file # type to 'application/octet-stream', rather than just choosing not to # provide a mimetype. In the case where what we get from the browser # is obviously wrong, try to guess. if (file.content_type and len(file.content_type.split('/')) == 2 and file.content_type != 'application/octet-stream'): mimetype = file.content_type else: mimetype = self._guess_mimetype(file) filename = '%s__%s' % (uuid4(), file.name) if self.cleaned_data['attachment_history'] is None: # This is a new file: create a new FileAttachmentHistory for it attachment_history = FileAttachmentHistory() attachment_revision = 1 attachment_history.display_position = \ FileAttachmentHistory.compute_next_display_position( self.review_request) attachment_history.save() self.review_request.file_attachment_histories.add( attachment_history) else: attachment_history = self.cleaned_data['attachment_history'] try: latest = attachment_history.file_attachments.latest() except FileAttachment.DoesNotExist: latest = None if latest is None: # This should theoretically never happen, but who knows. attachment_revision = 1 elif latest.review_request.exists(): # This is a new update in the draft. attachment_revision = latest.attachment_revision + 1 else: # The most recent revision is part of the same draft. Delete it # and replace with the newly uploaded file. attachment_revision = latest.attachment_revision latest.delete() attachment_kwargs = { 'attachment_history': attachment_history, 'attachment_revision': attachment_revision, 'caption': '', 'draft_caption': caption, 'orig_filename': os.path.basename(file.name), 'mimetype': mimetype, } if filediff: file_attachment = FileAttachment.objects.create_from_filediff( filediff, save=False, **attachment_kwargs) else: file_attachment = FileAttachment(**attachment_kwargs) file_attachment.file.save(filename, file, save=True) draft = ReviewRequestDraft.create(self.review_request) draft.file_attachments.add(file_attachment) draft.save() return file_attachment