def deleteTagGroup(self, tagGroupKey, isKey=True): metadata = WebServiceObject() try: if isKey: tagGroup = TagGroup.objects.get(pk__exact=tagGroupKey) else: tagGroup = tagGroupKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_GROUP_KEY except Exception: raise Errors.INTERNAL_ERROR if not tagGroup.writePermissions(self.user): raise Errors.AUTHENTICATION metadata.limitFields(self.fields) # add new tag to response for success metadata.put("id", tagGroup.pk) metadata.put("name", tagGroup.name) metadata.put("dateCreated", tagGroup.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) metadata.put("lastModified", tagGroup.lastModified.strftime("%Y-%m-%d %H:%M:%S")) metadata.put("imageId", tagGroup.picture.pk) try: tagGroup.delete() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) return metadata
def addQtl(self, qtl, pq_id, imageKey): metadata = WebServiceObject() print 'test 1' # get picture instance with imageKey try: image = Picture.objects.get(pk__exact=imageKey) except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_IMAGE_KEY if not self.user: raise Errors.NO_USER_KEY else: userID = self.user try: # save the new note if pq_id: # update pictureQtl = PictureQtl.objects.get(pk__exact=pq_id) if pictureQtl: pictureQtl.qtl = qtl pictureQtl.picture = image pictureQtl.user = userID pictureQtl.save() else: # error print 'Error: no PictureQtl.pk found!' else: # add new pictureQtl = PictureQtl(qtl=qtl, picture=image, user=userID) print 'test: trying store qtl.' pictureQtl.save() print 'test: qtl saved.' except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # limit metadata return metadata.limitFields(self.fields) # add new tag to response for success metadata.put('pq_id', pictureQtl.pk) metadata.put('picture', pictureQtl.picture.pk) metadata.put('qtl', pictureQtl.qtl) metadata.put('user', pictureQtl.user.username) metadata.put('dateCreated', pictureQtl.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) return metadata
def getGeneLink(self, geneLinkKey, isKey=True): metadata = WebServiceObject() try: if isKey: geneLink = GeneLink.objects.get(pk__exact=geneLinkKey) else: geneLink = geneLinkKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_GENE_LINK_KEY except Exception: raise Errors.INTERNAL_ERROR if not geneLink.readPermissions(self.user): raise Errors.AUTHENTICATION metadata.limitFields(self.fields) metadata.put('id', geneLink.pk) metadata.put('user', geneLink.user.username) metadata.put('tagId', geneLink.tag.pk) metadata.put('feature', LimitDict(self.fields, { 'uniqueName' : geneLink.feature.uniquename, 'name': geneLink.feature.name, 'organismId' : geneLink.feature.organism.organism_id }) ) return metadata
def getTag(self, tagKey, isKey=True): metadata = WebServiceObject() try: if (isKey): tag = Tag.objects.get(pk__exact=tagKey) else: tag = tagKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_KEY except Exception: raise Errors.INTERNAL_ERROR if not tag.readPermissions(self.user): raise Errors.AUTHENTICATION metadata.limitFields(self.fields) if metadata.allowsField('points'): tagPoints = TagPoint.objects.filter(tag__exact=tag) points = [] for tagPoint in tagPoints: points.append({'x': tagPoint.pointX, 'y': tagPoint.pointY}) metadata.put('points', points) metadata.put('id', tag.pk) metadata.put('color', [tag.color.red, tag.color.green, tag.color.blue]) metadata.put('name', tag.name) return metadata
def addNote(self, notes, pn_id, imageKey): metadata = WebServiceObject() # get picture instance with imageKey try: image = Picture.objects.get(pk__exact=imageKey) except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_IMAGE_KEY if not self.user: raise Errors.NO_USER_KEY else: userID = self.user try: # save the new note if pn_id: # update pictureNotes = PictureNotes.objects.get(pk__exact=pn_id) if pictureNotes: pictureNotes.notes = notes pictureNotes.picture = image pictureNotes.user = userID pictureNotes.save() else: # error print 'Error: no picture_notes.pk found!' else: # add new pictureNotes = PictureNotes(notes=notes, picture=image, user=userID) pictureNotes.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # limit metadata return metadata.limitFields(self.fields) # add new tag to response for success metadata.put('pn_id', pictureNotes.pk) metadata.put('picture', pictureNotes.picture.pk) metadata.put('notes', pictureNotes.notes) metadata.put('user', pictureNotes.user.username) metadata.put('dateCreated', pictureNotes.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) return metadata
def createGeneLink(self, tagKey, name=None, uniqueName=None, organismId=None, isKey=True): metadata = WebServiceObject() try: if isKey: tag = Tag.objects.get(pk__exact=tagKey) else: tag = tagKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_GROUP_KEY if not tag.writePermissions(self.user): raise Errors.AUTHENTICATION try: feature = None if name and organismId: feature = Feature.objects.filter(name=name, organism=organismId) if uniqueName: if feature: feature = feature & Feature.objects.filter(uniquename=uniqueName) else: feature = Feature.objects.filter(uniquename=uniqueName) if not feature: error = "" if name and organismId: error += "name: " + name + ", organismId: " + organismId if uniqueName: comma = ", " if error else "" error += comma + "uniqueName: " + uniqueName raise Errors.NO_MATCHING_FEATURE.setCustom(error) geneLink = GeneLink(tag=tag, feature=feature) geneLink.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # limit metadata return metadata.limitFields(self.fields) metadata.put('id', geneLink.pk) metadata.put('user', geneLink.user.username) metadata.put('tagId', geneLink.tag.pk) metadata.put('feature', LimitDict(self.fields, { 'uniqueName' : geneLink.feature.uniquename, 'name' : geneLink.feature.name, 'organismId' : geneLink.feature.organism.organism_id }) ) return metadata
def createTag(self, tagGroupKey, points, name, color, isKey=True): metadata = WebServiceObject() tagPoints = [] try: if isKey: tagGroup = TagGroup.objects.get(pk__exact=tagGroupKey) else: tagGroup = tagGroupKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_GROUP_KEY if not tagGroup.writePermissions(self.user): raise Errors.AUTHENTICATION # create the new tag points to put in the tag try: for counter, point in enumerate(points): tagPoints.append(TagPoint(pointX=float(point['x']), pointY=float(point['y']) , rank=counter+1)) except (TypeError, KeyError, ValueError): raise Errors.INVALID_SYNTAX.setCustom('points') try: # create new tag color try: if len(color) == 3: tagColor = TagColor.objects.get_or_create(red=int(color[0]), green=int(color[1]), blue=int(color[2]))[0] except (ValueError, TypeError): raise Errors.INVALID_SYNTAX.setCustom('color') # start saving the new tag now that it has passed all tests tag = Tag(name=name, color=tagColor, group=tagGroup, user=self.user) tag.save() for tagPoint in tagPoints: tagPoint.tag = tag tagPoint.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # limit metadata return metadata.limitFields(self.fields) # add new tag to response for success metadata.put('id', tag.pk) metadata.put('user', tag.user.username) metadata.put('color', [tag.color.red, tag.color.green, tag.color.blue]) metadata.put('name', tag.name) metadata.put('points', points) return metadata
def getQtl(self, imageKey): metadata = WebServiceObject() try: pictureQtl = PictureQtl.objects.filter( picture__exact=imageKey).order_by('-dateCreated')[:1].get() except (ObjectDoesNotExist, ValueError): return metadata metadata.limitFields(self.fields) metadata.put('pq_id', pictureQtl.pk) metadata.put('picture', pictureQtl.picture.pk) metadata.put('qtl', pictureQtl.qtl) metadata.put('user', pictureQtl.user.username) metadata.put('dateCreated', pictureQtl.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) return metadata
def getNote(self, imageKey): metadata = WebServiceObject() try: pictureNotes = PictureNotes.objects.filter( picture__exact=imageKey).order_by('-dateCreated')[:1].get() except (ObjectDoesNotExist, ValueError): return metadata #except Exception: # raise Errors.INTERNAL_ERROR metadata.limitFields(self.fields) metadata.put('pn_id', pictureNotes.pk) metadata.put('picture', pictureNotes.picture.pk) metadata.put('notes', pictureNotes.notes) metadata.put('user', pictureNotes.user.username) metadata.put('dateCreated', pictureNotes.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) return metadata
def deleteGeneLink(self, geneLinkKey, isKey=True): metadata = WebServiceObject() try: if (isKey): geneLink = GeneLink.objects.get(pk__exact=geneLinkKey) else: geneLink = geneLinkKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_GENE_LINK_KEY except Exception: raise Errors.INTERNAL_ERROR if not geneLink.writePermissions(self.user): raise Errors.AUTHENTICATION metadata.limitFields(self.fields) metadata.put('id', geneLink.pk) metadata.put('tagId', geneLink.tag.pk) metadata.put( 'feature', LimitDict( self.fields, { 'uniqueName': geneLink.feature.uniquename, 'name': geneLink.feature.name, 'organismId': geneLink.feature.organism.organism_id })) try: geneLink.delete() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) return metadata
def deleteGeneLink(self, geneLinkKey, isKey=True): metadata = WebServiceObject() try: if (isKey): geneLink = GeneLink.objects.get(pk__exact=geneLinkKey) else: geneLink = geneLinkKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_GENE_LINK_KEY except Exception: raise Errors.INTERNAL_ERROR if not geneLink.writePermissions(self.user): raise Errors.AUTHENTICATION metadata.limitFields(self.fields) metadata.put('id', geneLink.pk) metadata.put('tagId', geneLink.tag.pk) metadata.put('feature', LimitDict(self.fields, { 'uniqueName' : geneLink.feature.uniquename, 'name' : geneLink.feature.name, 'organismId' : geneLink.feature.organism.organism_id }) ) try: geneLink.delete() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) return metadata
def deleteTag(self, tagKey, isKey=True): metadata = WebServiceObject() try: if (isKey): tag = Tag.objects.get(pk__exact=tagKey) else: tag = tagKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_GENE_LINK_KEY except Exception: raise Errors.INTERNAL_ERROR if not tag.writePermissions(self.user): raise Errors.AUTHENTICATION metadata.limitFields(self.fields) if metadata.allowsField('points'): tagPoints = TagPoint.objects.filter(tag__exact=tag) points = [] for tagPoint in tagPoints: points.append({ 'x' : tagPoint.pointX, 'y' : tagPoint.pointY }) metadata.put('points', points) metadata.put('id', tag.pk) metadata.put('color', [tag.color.red, tag.color.green, tag.color.blue]) metadata.put('name', tag.name) try: tag.delete() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e))
def deleteTag(self, tagKey, isKey=True): metadata = WebServiceObject() try: if (isKey): tag = Tag.objects.get(pk__exact=tagKey) else: tag = tagKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_GENE_LINK_KEY except Exception: raise Errors.INTERNAL_ERROR if not tag.writePermissions(self.user): raise Errors.AUTHENTICATION metadata.limitFields(self.fields) if metadata.allowsField('points'): tagPoints = TagPoint.objects.filter(tag__exact=tag) points = [] for tagPoint in tagPoints: points.append({ 'x' : tagPoint.pointX, 'y' : tagPoint.pointY }) metadata.put('points', points) metadata.put('id', tag.pk) metadata.put('color', [tag.color.red, tag.color.green, tag.color.blue]) metadata.put('name', tag.name) try: tag.delete() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e))
def getTag(self, tagKey, isKey=True): metadata = WebServiceObject() try: if (isKey): tag = Tag.objects.get(pk__exact=tagKey) else: tag = tagKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_KEY except Exception: raise Errors.INTERNAL_ERROR if not tag.readPermissions(self.user): raise Errors.AUTHENTICATION metadata.limitFields(self.fields) if metadata.allowsField('points'): tagPoints = TagPoint.objects.filter(tag__exact=tag) points = [] for tagPoint in tagPoints: points.append({ 'x' : tagPoint.pointX, 'y' : tagPoint.pointY }) metadata.put('points', points) metadata.put('id', tag.pk) metadata.put('color', [tag.color.red, tag.color.green, tag.color.blue]) metadata.put('name', tag.name) return metadata
def deleteImage(self, imageKey, isKey=True): organisms = [] metadata = WebServiceObject() try: if isKey: image = Picture.objects.get(pk__exact=imageKey) else: image = imageKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_IMAGE_KEY if not image.writePermissions(self.user): raise Errors.AUTHENTICATION if not self.fields or 'organisms' in self.fields: defTags = PictureDefinitionTag.objects.filter(picture__exact=image) for tag in defTags: try: organisms.append({ 'commonName': tag.organism.common_name, 'abbreviation': tag.organism.abbreviation, 'genus': tag.organism.genus, 'species': tag.organism.species, 'id': tag.organism.pk }) except ObjectDoesNotExist: None metadata.limitFields(self.fields) # put in the information we care about metadata.put('organisms', organisms) metadata.put('description', image.description) metadata.put('altText', image.altText) metadata.put('uploadedBy', image.user.username) metadata.put('uploadDate', image.uploadDate.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('url', image.imageName.url) metadata.put('thumbnail', image.thumbnail.url) metadata.put('id', image.pk) try: image.delete() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) return metadata
def createTagGroup(self, imageKey, name, isKey=True): metadata = WebServiceObject() try: if isKey: image = Picture.objects.get(pk__exact=imageKey) else: image = imageKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_IMAGE_KEY if not image.writePermissions(self.user): raise Errors.AUTHENTICATION # start saving the new tag now that it has passed all tests tagGroup = TagGroup(name=name, picture=image, user=self.user) try: tagGroup.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # limit metadata return metadata.limitFields(self.fields) # add new tag to response for success metadata.put('id', tagGroup.pk) metadata.put('name', tagGroup.name) metadata.put('user', tagGroup.user.username) metadata.put('dateCreated', tagGroup.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('lastModified', tagGroup.lastModified.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('imageId', tagGroup.picture.pk) metadata.put('isPrivate', tagGroup.isPrivate) return metadata
def getImageMetadata(self, imageKey, isKey=True): organisms = [] metadata = WebServiceObject() try: if (isKey): image = Picture.objects.get(pk__exact=imageKey) else: image = imageKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_IMAGE_KEY if not image.readPermissions(self.user): raise Errors.AUTHENTICATION if not self.fields or 'organisms' in self.fields: defTags = PictureDefinitionTag.objects.filter(picture__exact=image) for tag in defTags: organisms.append({ 'commonName': tag.organism.common_name, 'abbreviation': tag.organism.abbreviation, 'genus': tag.organism.genus, 'species': tag.organism.species, 'id': tag.organism.pk }) metadata.limitFields(self.fields) # put in the information we care about metadata.put('organisms', organisms) metadata.put('description', image.description) metadata.put('altText', image.altText) metadata.put('uploadedBy', image.user.username) metadata.put('uploadDate', image.uploadDate.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('url', image.imageName.url) metadata.put('thumbnail', image.thumbnail.url) metadata.put('id', image.pk) # add to recently viewed images if there is a user if self.user and self.user.is_authenticated(): RecentlyViewedPicture.objects.get_or_create( user=self.user, picture=image)[0].save() return metadata
def getImageMetadata(self, imageKey, isKey=True): organisms = [] metadata = WebServiceObject() try: if (isKey): image = Picture.objects.get(pk__exact=imageKey) else: image = imageKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_IMAGE_KEY if not image.readPermissions(self.user): raise Errors.AUTHENTICATION if not self.fields or 'organisms' in self.fields: defTags = PictureDefinitionTag.objects.filter(picture__exact=image) for tag in defTags: organisms.append({ 'commonName' : tag.organism.common_name, 'abbreviation' : tag.organism.abbreviation, 'genus' : tag.organism.genus, 'species' : tag.organism.species, 'id' : tag.organism.pk }) metadata.limitFields(self.fields) # put in the information we care about metadata.put('organisms', organisms) metadata.put('description', image.description) metadata.put('altText', image.altText) metadata.put('uploadedBy', image.user.username) metadata.put('uploadDate', image.uploadDate.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('url', image.imageName.url) metadata.put('thumbnail', image.thumbnail.url) metadata.put('id', image.pk) # add to recently viewed images if there is a user if self.user and self.user.is_authenticated(): RecentlyViewedPicture.objects.get_or_create(user=self.user, picture=image)[0].save() return metadata
def updateTag(self, tagKey, points=None, name=None, color=None, isKey=True): metadata = WebServiceObject() try: if (isKey): tag = Tag.objects.get(pk__exact=tagKey) else: tag = tagKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_KEY if not tag.writePermissions(self.user): raise Errors.AUTHENTICATION # update the description if name: tag.name = name # update the color (ignores bad syntax) try: if color and len(color) == 3: tagColor = TagColor.objects.get_or_create(red=color[0], green=color[1], blue=color[2])[0] tag.color = tagColor except (ValueError, TypeError): raise Errors.INVALID_SYNTAX.setCustom('color') oldTagPoints = list(TagPoint.objects.filter(tag__exact=tag)) # updates the tag points for this tag if points: # first we delete the old tag points (they aren't helpful anymore) # TODO: add Trash database for restoring accidental changes try: newTagPointModels = [] # Save the new tag points # create the new tag points to put in the tag for counter, point in enumerate(points): newTagPointModels.append( TagPoint(pointX=float(point['x']), pointY=float(point['y']), rank=counter + 1)) except (TypeError, KeyError, ValueError): raise Errors.INVALID_SYNTAX.setCustom('points') metadata.limitFields(self.fields) try: tag.save() if points: for newTagPoint in newTagPointModels: newTagPoint.tag = tag newTagPoint.save() for tagPoint in oldTagPoints: tagPoint.delete() metadata.put('points', points) else: tagPoints = [] for tagPoint in oldTagPoints: tagPoints.append({ 'x': tagPoint.pointX, 'y': tagPoint.pointY }) metadata.put('points', tagPoints) except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # add new tag to response for success metadata.put('id', tag.pk) metadata.put('user', tag.user) metadata.put('color', [tag.color.red, tag.color.green, tag.color.blue]) metadata.put('name', tag.name) return metadata
def createImageMetadata(self, image, description, altText, organisms, isKey=True): organismsArr = [] metadata = WebServiceObject() if not (self.user and self.user.is_authenticated()): raise Errors.AUTHENTICATION filetype = imghdr.what(image.file) if not filetype or filetype not in set( ['gif', 'tiff', 'jpeg', 'bmp', 'png']): raise Errors.INVALID_IMAGE_TYPE wrappedFile, thumbnailFile, filename, thumbnailName = handleUpload( image) if self.user.is_staff: upload = Picture(user=self.user, isPrivate=False, imageName=wrappedFile.file, thumbnail=thumbnailFile.file) else: upload = Picture(user=self.user, isPrivate=True, imageName=wrappedFile.file, thumbnail=thumbnailFile.file) try: upload.save() except DatabaseError as e: transaction.rollback() os.remove(filename) os.remove(thumbnailName) raise Errors.INTEGRITY_ERROR.setCustom(str(e)) os.remove(filename) os.remove(thumbnailName) # now that image has been properly uploaded add the metadata to it organismField = not self.fields or 'organisms' in self.fields if organisms: newOrganisms = Organism.objects.filter(organism_id__in=organisms) newDefTags = [] for newOrg in newOrganisms: newDefTags.append( PictureDefinitionTag(picture=upload, organism=newOrg)) try: for newTag in newDefTags: newTag.save() if organismField: organismsArr.append({ 'commonName': newTag.organism.common_name, 'abbreviation': newTag.organism.abbreviation, 'genus': newTag.organism.genus, 'species': newTag.organism.species, 'id': newTag.organism.pk }) except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) if description: upload.description = description try: upload.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) if altText: upload.altText = altText try: upload.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) metadata.limitFields(self.fields) # put in the information we care about metadata.put('organisms', organismsArr) metadata.put('description', upload.description) metadata.put('altText', upload.altText) metadata.put('uploadedBy', upload.user.username) metadata.put('uploadDate', upload.uploadDate.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('url', upload.imageName.url) metadata.put('thumbnail', upload.thumbnail.url) metadata.put('id', upload.pk) return metadata
def createTag(self, tagGroupKey, points, name, color, isKey=True): metadata = WebServiceObject() tagPoints = [] try: if isKey: tagGroup = TagGroup.objects.get(pk__exact=tagGroupKey) else: tagGroup = tagGroupKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_GROUP_KEY if not tagGroup.writePermissions(self.user): raise Errors.AUTHENTICATION # create the new tag points to put in the tag try: for counter, point in enumerate(points): tagPoints.append( TagPoint(pointX=float(point['x']), pointY=float(point['y']), rank=counter + 1)) except (TypeError, KeyError, ValueError): raise Errors.INVALID_SYNTAX.setCustom('points') try: # create new tag color try: if len(color) == 3: tagColor = TagColor.objects.get_or_create( red=int(color[0]), green=int(color[1]), blue=int(color[2]))[0] except (ValueError, TypeError): raise Errors.INVALID_SYNTAX.setCustom('color') # start saving the new tag now that it has passed all tests tag = Tag(name=name, color=tagColor, group=tagGroup, user=self.user) tag.save() for tagPoint in tagPoints: tagPoint.tag = tag tagPoint.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # limit metadata return metadata.limitFields(self.fields) # add new tag to response for success metadata.put('id', tag.pk) metadata.put('user', tag.user.username) metadata.put('color', [tag.color.red, tag.color.green, tag.color.blue]) metadata.put('name', tag.name) metadata.put('points', points) return metadata
def getImageMetadata(self, imageKey, isKey=True): # TODO: getImageMetadata() should be refactorized because it is used for all image loading parts # including image list even thumbnail image. It potentially has unnecessary database queries. organisms = [] geneIDs = [] metadata = WebServiceObject() try: if (isKey): image = Picture.objects.get(pk__exact=imageKey) else: image = imageKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_IMAGE_KEY # Get gene information geneSymbol = None geneName = None if image is not None: # Gene ID pictureGIDs = PictureGeneID.objects.filter(picture__exact=image) for picGID in pictureGIDs: geneIDs.append({ 'geneID': picGID.gene_id, 'version': picGID.version }) pictureMbs = PictureMgdb.objects.filter(picture__exact=image) for pMb in pictureMbs: geneSymbol = pMb.locus_name geneName = pMb.locus_full_name break if not image.readPermissions(self.user): raise Errors.AUTHENTICATION if not self.fields or 'organisms' in self.fields: defTags = PictureDefinitionTag.objects.filter(picture__exact=image) for tag in defTags: organisms.append({ 'commonName': tag.organism.common_name, 'abbreviation': tag.organism.abbreviation, 'genus': tag.organism.genus, 'species': tag.organism.species, 'id': tag.organism.pk }) # Get all imageID for imageName images = Picture.objects.filter(imageName__exact=image.imageName) # Get Image Notes Information notes_id = '' notes = '' notesBy = '' pictureNotesAPI = NotesAPI(self.user) for imageID in images: pictureNotes = pictureNotesAPI.getNote(imageID).getObject() if pictureNotes: notes_id = pictureNotes['pn_id'] notes = pictureNotes['notes'] notesBy = pictureNotes['user'] break # Get QTL information qtls_id = '' qtl = '' pictureQtlAPI = QtlAPI(self.user) for imageID in images: pictureQtl = pictureQtlAPI.getQtl(imageID).getObject() if pictureQtl: qtls_id = pictureQtl['pq_id'] qtl = pictureQtl['qtl'] break metadata.limitFields(self.fields) # put in the information we care about metadata.put('organisms', organisms) metadata.put('description', image.description) metadata.put('altText', image.altText) metadata.put('uploadedBy', image.user.username) metadata.put('uploadDate', image.uploadDate.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('url', image.imageName.url) metadata.put('thumbnail', image.thumbnail.url) metadata.put('id', image.pk) metadata.put('geneIDs', geneIDs) metadata.put('geneSymbol', geneSymbol) metadata.put('geneName', geneName) metadata.put('notes_id', notes_id) metadata.put('notes', notes) metadata.put('notesBy', notesBy) metadata.put('qtls_id', qtls_id) metadata.put('qtl', qtl) return metadata
def getTagGroup(self, tagGroupKey, isKey=True): metadata = WebServiceObject() try: if (isKey): tagGroup = TagGroup.objects.get(pk__exact=tagGroupKey) else: tagGroup = tagGroupKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_GROUP_KEY except Exception: raise Errors.INTERNAL_ERROR if not tagGroup.readPermissions(self.user): raise Errors.AUTHENTICATION metadata.limitFields(self.fields) metadata.put('id', tagGroup.pk) metadata.put('name', tagGroup.name) metadata.put('user', tagGroup.user.username) metadata.put('dateCreated', tagGroup.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('lastModified', tagGroup.lastModified.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('imageId', tagGroup.picture.pk) metadata.put('isPrivate', tagGroup.isPrivate) return metadata
def createImageMetadata(self, image, description, altText, organisms, isKey=True): organismsArr = [] metadata = WebServiceObject() if not (self.user and self.user.is_authenticated()): raise Errors.AUTHENTICATION filetype = imghdr.what(image.file) if not filetype or filetype not in set(['gif', 'tiff', 'jpeg', 'bmp', 'png']): raise Errors.INVALID_IMAGE_TYPE wrappedFile, thumbnailFile, filename, thumbnailName = handleUpload(image) if self.user.is_staff: upload = Picture(user=self.user, isPrivate=False, imageName=wrappedFile.file, thumbnail=thumbnailFile.file) else: upload = Picture(user=self.user, isPrivate=True, imageName=wrappedFile.file, thumbnail=thumbnailFile.file) try: upload.save() except DatabaseError as e: transaction.rollback() os.remove(filename) os.remove(thumbnailName) raise Errors.INTEGRITY_ERROR.setCustom(str(e)) os.remove(filename) os.remove(thumbnailName) # now that image has been properly uploaded add the metadata to it organismField = not self.fields or 'organisms' in self.fields if organisms: newOrganisms = Organism.objects.filter(organism_id__in=organisms) newDefTags = [] for newOrg in newOrganisms: newDefTags.append(PictureDefinitionTag(picture=upload, organism=newOrg)) try: for newTag in newDefTags: newTag.save() if organismField: organismsArr.append({ 'commonName' : newTag.organism.common_name, 'abbreviation' : newTag.organism.abbreviation, 'genus' : newTag.organism.genus, 'species' : newTag.organism.species, 'id' : newTag.organism.pk }) except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) if description: upload.description = description try: upload.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) if altText: upload.altText = altText try: upload.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) metadata.limitFields(self.fields) # put in the information we care about metadata.put('organisms', organismsArr) metadata.put('description', upload.description) metadata.put('altText', upload.altText) metadata.put('uploadedBy', upload.user.username) metadata.put('uploadDate', upload.uploadDate.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('url', upload.imageName.url) metadata.put('thumbnail', upload.thumbnail.url) metadata.put('id', upload.pk) return metadata
def updateTag(self, tagKey, points=None, name=None, color=None, isKey=True): metadata = WebServiceObject() try: if (isKey): tag = Tag.objects.get(pk__exact=tagKey) else: tag = tagKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_KEY if not tag.writePermissions(self.user): raise Errors.AUTHENTICATION # update the description if name: tag.name = name # update the color (ignores bad syntax) try: if color and len(color) == 3: tagColor = TagColor.objects.get_or_create(red=color[0], green=color[1], blue=color[2])[0] tag.color = tagColor except (ValueError, TypeError): raise Errors.INVALID_SYNTAX.setCustom('color') oldTagPoints = list(TagPoint.objects.filter(tag__exact=tag)) # updates the tag points for this tag if points: # first we delete the old tag points (they aren't helpful anymore) # TODO: add Trash database for restoring accidental changes try: newTagPointModels = [] # Save the new tag points # create the new tag points to put in the tag for counter, point in enumerate(points): newTagPointModels.append(TagPoint(pointX=float(point['x']), pointY=float(point['y']) , rank=counter+1)) except (TypeError, KeyError, ValueError): raise Errors.INVALID_SYNTAX.setCustom('points') metadata.limitFields(self.fields) try: tag.save() if points: for newTagPoint in newTagPointModels: newTagPoint.tag = tag newTagPoint.save() for tagPoint in oldTagPoints: tagPoint.delete() metadata.put('points', points) else: tagPoints = [] for tagPoint in oldTagPoints: tagPoints.append({ 'x' : tagPoint.pointX, 'y' : tagPoint.pointY }) metadata.put('points', tagPoints) except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # add new tag to response for success metadata.put('id', tag.pk) metadata.put('user', tag.user) metadata.put('color', [tag.color.red, tag.color.green, tag.color.blue]) metadata.put('name', tag.name) return metadata
def updateTagGroup(self, tagGroupKey, name=None, isKey=True): metadata = WebServiceObject() try: if (isKey): tagGroup = TagGroup.objects.get(pk__exact=tagGroupKey) else: tagGroup = tagGroupKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_GROUP_KEY if not tagGroup.writePermissions(self.user): raise Errors.AUTHENTICATION # update the name if name: tagGroup.name = name metadata.limitFields(self.fields) try: tagGroup.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # add new tag to response for success metadata.put('id', tagGroup.pk) metadata.put('name', tagGroup.name) metadata.put('user', tagGroup.user.username) metadata.put('dateCreated', tagGroup.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('lastModified', tagGroup.lastModified.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('imageId', tagGroup.picture.pk) metadata.put('isPrivate', tagGroup.isPrivate) return metadata
def updateTagGroup(self, tagGroupKey, name=None, isKey=True): metadata = WebServiceObject() try: if (isKey): tagGroup = TagGroup.objects.get(pk__exact=tagGroupKey) else: tagGroup = tagGroupKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_GROUP_KEY if not tagGroup.writePermissions(self.user): raise Errors.AUTHENTICATION # update the name if name: tagGroup.name = name metadata.limitFields(self.fields) try: tagGroup.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # add new tag to response for success metadata.put('id', tagGroup.pk) metadata.put('name', tagGroup.name) metadata.put('user', tagGroup.user.username) metadata.put('dateCreated', tagGroup.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('lastModified', tagGroup.lastModified.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('imageId', tagGroup.picture.pk) metadata.put('isPrivate', tagGroup.isPrivate) return metadata
def createTagGroup(self, imageKey, name, isKey=True): metadata = WebServiceObject() try: if isKey: image = Picture.objects.get(pk__exact=imageKey) else: image = imageKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_IMAGE_KEY if not image.writePermissions(self.user): raise Errors.AUTHENTICATION # start saving the new tag now that it has passed all tests tagGroup = TagGroup(name=name, picture=image, user=self.user) try: tagGroup.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # limit metadata return metadata.limitFields(self.fields) # add new tag to response for success metadata.put('id', tagGroup.pk) metadata.put('name', tagGroup.name) metadata.put('user', tagGroup.user.username) metadata.put('dateCreated', tagGroup.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('lastModified', tagGroup.lastModified.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('imageId', tagGroup.picture.pk) metadata.put('isPrivate', tagGroup.isPrivate) return metadata
def getTagGroup(self, tagGroupKey, isKey=True): metadata = WebServiceObject() try: if (isKey): tagGroup = TagGroup.objects.get(pk__exact=tagGroupKey) else: tagGroup = tagGroupKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_GROUP_KEY except Exception: raise Errors.INTERNAL_ERROR if not tagGroup.readPermissions(self.user): raise Errors.AUTHENTICATION metadata.limitFields(self.fields) metadata.put('id', tagGroup.pk) metadata.put('name', tagGroup.name) metadata.put('user', tagGroup.user.username) metadata.put('dateCreated', tagGroup.dateCreated.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('lastModified', tagGroup.lastModified.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('imageId', tagGroup.picture.pk) metadata.put('isPrivate', tagGroup.isPrivate) return metadata
def editImageMetadata(self, imageKey, description, altText, organisms, isKey=True): organismsArr = [] metadata = WebServiceObject() try: if isKey: image = Picture.objects.get(pk__exact=imageKey) else: image = imageKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_IMAGE_KEY if not image.writePermissions(self.user): raise Errors.AUTHENTICATION defTags = PictureDefinitionTag.objects.filter(picture__exact=image) organismField = not self.fields or 'organisms' in self.fields if organisms: newOrganisms = Organism.objects.filter(organism_id__in=organisms) newDefTags = [] for newOrg in newOrganisms: newDefTags.append(PictureDefinitionTag(picture=image, organism=newOrg)) try: defTags.delete() for newTag in newDefTags: newTag.save() if organismField: organismsArr.append({ 'commonName' : newTag.organism.common_name, 'abbreviation' : newTag.organism.abbreviation, 'genus' : newTag.organism.genus, 'species' : newTag.organism.species, 'id' : newTag.organism.pk }) except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) if description: image.description = description try: image.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) if altText: image.altText = altText try: image.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) metadata.limitFields(self.fields) if not organisms and organismField: for defTag in defTags: organisms.append({ 'commonName' : defTag.organism.common_name, 'abbreviation' : defTag.organism.abbreviation, 'genus' : defTag.organism.genus, 'species' : defTag.organism.species, 'id' : defTag.organism.pk }) # put in the information we care about metadata.put('organisms', organismsArr) metadata.put('description', image.description) metadata.put('altText', image.altText) metadata.put('uploadedBy', image.user.username) metadata.put('uploadDate', image.uploadDate.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('url', image.imageName.url) metadata.put('thumbnail', image.thumbnail.url) metadata.put('id', image.pk) return metadata
def deleteImage(self, imageKey, isKey=True): organisms = [] metadata = WebServiceObject() try: if isKey: image = Picture.objects.get(pk__exact=imageKey) else: image = imageKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_IMAGE_KEY if not image.writePermissions(self.user): raise Errors.AUTHENTICATION if not self.fields or 'organisms' in self.fields: defTags = PictureDefinitionTag.objects.filter(picture__exact=image) for tag in defTags: try: organisms.append({ 'commonName' : tag.organism.common_name, 'abbreviation' : tag.organism.abbreviation, 'genus' : tag.organism.genus, 'species' : tag.organism.species, 'id' : tag.organism.pk }) except ObjectDoesNotExist: None metadata.limitFields(self.fields) # put in the information we care about metadata.put('organisms', organisms) metadata.put('description', image.description) metadata.put('altText', image.altText) metadata.put('uploadedBy', image.user.username) metadata.put('uploadDate', image.uploadDate.strftime("%Y-%m-%d %H:%M:%S")) metadata.put('url', image.imageName.url) metadata.put('thumbnail', image.thumbnail.url) metadata.put('id', image.pk) try: image.delete() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) return metadata
def createGeneLink(self, tagKey, name=None, allele=None, organismId=None, isKey=True): metadata = WebServiceObject() try: if isKey: tag = Tag.objects.get(pk__exact=tagKey) else: tag = tagKey except (ObjectDoesNotExist, ValueError): raise Errors.INVALID_TAG_GROUP_KEY if not tag.writePermissions(self.user): raise Errors.AUTHENTICATION try: feature = None if name and organismId: feature = Feature.objects.filter(name=name, organism=organismId) if not feature: error = "Could not find a feature with the parameters: " if name and organismId: error += "name: " + name + ", organismId: " + organismId raise Errors.NO_MATCHING_FEATURE.setCustom(error) elif len(feature) > 1: error = "Multiple matches for parameters: " if name and organismId: error += "name: " + name + ", organismId: " + organismId error += "\n\n Responses: \n\n" for f in feature: error += "uniquename: " + f.uniquename + ", name: " + f.name + ", organism: " + f.organism.common_name + "\n\n" raise Errors.NO_MATCHING_FEATURE.setCustom(error) if allele: vID = None vID = Variation.objects.using('mgdb').filter(name__exact=allele) if not vID: errorAllele = Errors.NO_MATCHING_ALLELE.setCustom(allele) raise errorAllele geneLink = GeneLink(tag=tag, feature=feature[0], user=self.user, allele=allele) geneLink.save() except DatabaseError as e: transaction.rollback() raise Errors.INTEGRITY_ERROR.setCustom(str(e)) # limit metadata return metadata.limitFields(self.fields) metadata.put('id', geneLink.pk) metadata.put('user', geneLink.user.username) metadata.put('tagId', geneLink.tag.pk) metadata.put('feature', LimitDict(self.fields, { 'uniqueName' : geneLink.feature.uniquename, 'name' : geneLink.feature.name, 'allele': geneLink.allele, 'organismId' : geneLink.feature.organism.organism_id }) ) return metadata