def export(dir, show, elType, name=None, sequence=None, shot=None, clipName=None, work=False, release=False): if not os.path.isdir(dir): raise ValueError('Not a directory: {}'.format(dir)) el = Element(name, elType, show=show, sequence=sequence, shot=shot, clipName=clipName) if not el.exists(): raise ValueError('Given element does not exist') date = str(env.getCreationInfo(format=False)[1].date()) if work: finalDest = os.path.join(dir, 'work_' + el._rawId + '_' + date) if not os.path.exists(finalDest): os.makedirs(finalDest) fileutils.relativeCopyTree(el.work_path, finalDest) if release: finalDest = os.path.join(dir, 'release_' + el._rawId + '_' + date) if not os.path.exists(finalDest): os.makedirs(finalDest) fileutils.relativeCopyTree(el.release_path, finalDest)
def addComment(self, text): text = text.replace("'", '').replace( '"', '' ) # Temp work around until I can either escape quotes or properly update the DB with the value self.commentList.append( (env.USER, str(env.getCreationInfo(format=False)[1]), text)) self.set('comments', self.comments)
def __init__(self, num, show=None, author=None, makeDirs=False, dummy=False): self.table = Sequence.TABLE self.num = num self.show = show if show else env.getEnvironment('show') self._exists = None if dummy: return if num is None: raise ValueError('Sequence\'s num can\'t be None') try: self.num = int(num) except ValueError: raise ValueError( 'Sequence number must be a number, not: {}'.format(num)) if not self.show: raise ValueError( 'Tried to fallback to environment-set show, but it was null.') fetched = self.exists(fetch=True) if fetched: self.unmap(fetched) self._exists = True else: creationInfo = env.getCreationInfo(format=False) self.author = author if author else creationInfo[0] self.creation = creationInfo[1] s = Show.fromPk(self.show) if not s: raise ValueError('No such show: {}'.format(show)) else: self.work_path = os.path.join(s.work_path, self.directory) self.release_path = os.path.join(s.release_path, self.directory) p = Person(self.author) if not p.exists(): raise ValueError('No such user: {}'.format(self.author)) if makeDirs: if not os.path.isdir(self.work_path): os.makedirs(self.work_path) if not os.path.isdir(self.release_path): os.makedirs(self.release_path)
def accept(self): stage = str(self.CMB_stages.currentText()).lower() status = str(self.CMB_status.currentText()) assignee = str(self.LNE_assignee.text()) user = None if assignee: user = Person(assignee) assignee = user.username else: assignee = None if user and not user.exists(): QMessageBox.warning(self, 'Stages', 'Specified assignee does not exist') return stg = Stage(self.shot.id, stage, show=self.shot.show) if status != stg.status: if status == Stage.STATUS[0]: # N/A stg.set('status', status) stg.set('begin_date', None) stg.set('completion_date', None) elif status == Stage.STATUS[1]: # pre-prod stg.set('status', status) stg.set('completion_date', None) if stg.status == Stage.STATUS[0]: # If was N/A, set begin date stg.set('begin_date', env.getCreationInfo(format=False)[1]) elif status == Stage.STATUS[2]: # assigned stg.set('status', status) stg.set('completion_date', None) if stg.status == Stage.STATUS[0]: # If was N/A, set begin date stg.set('begin_date', env.getCreationInfo(format=False)[1]) elif status == Stage.STATUS[3]: # ip stg.set('status', status) stg.set('completion_date', None) if stg.status == Stage.STATUS[0]: # If was N/A, set begin date stg.set('begin_date', env.getCreationInfo(format=False)[1]) elif status == Stage.STATUS[4]: # review stg.set('status', status) stg.set('completion_date', None) if stg.status == Stage.STATUS[0]: # If was N/A, set begin date stg.set('begin_date', env.getCreationInfo(format=False)[1]) elif status == Stage.STATUS[5]: # done stg.set('status', status) if stg.status == Stage.STATUS[0]: # If was N/A, set begin date stg.set('begin_date', env.getCreationInfo(format=False)[1]) stg.set('completion_date', env.getCreationInfo(format=False)[1]) if assignee != stg.assigned_to: stg.set('assigned_to', assignee) QMessageBox.information( self, 'Stages', 'Successfully updated stage "{}"'.format(stage)) super(UpdateStageDialog, self).accept()
def __init__(self, elementName, elementType, filePath, versionlessFilePath, show=None, sequence=None, shot=None, comment=None, fix=None, dummy=False): self.table = PublishedFile.TABLE if dummy: return self.elementName = elementName self.elementType = elementType self.show = show if show else env.getEnvironment('show') self.elementId = None self.fixId = None self._exists = None if not self.show: raise ValueError( 'Tried to fallback to environment-set show, but it was null.') if filePath is None: raise ValueError('Must provide a file path') if versionlessFilePath is None: raise ValueError('Must provide a versionless file path') if self.elementType is None: raise ValueError( 'Must provide an element type to attach this Published File to' ) e = Element(self.elementName, self.elementType, show=self.show, sequence=sequence, shot=shot) if not e.exists(): raise ValueError( 'No such element to attach to: {} ({}) in {}{}{}'.format( e.name, e.type, e.show, ' in sequence {}'.format(e.sequence), ' in shot {}'.format(e.shot))) else: self.elementId = e.id self.version = PublishedFile.nextVersion(self.show, self.elementId) fetched = self.exists(fetch=True) if fetched: self.unmap(fetched) self._exists = True else: self._exists = False creationInfo = env.getCreationInfo(format=False) self.author = creationInfo[0] self.creation = creationInfo[1] self.comment = comment self.file_path = filePath self.versionless_path = versionlessFilePath s = Show.fromPk(self.show) p = Person(self.author) if not s: raise ValueError('No such show: {}'.format(self.show)) if not p.exists(): raise ValueError('No such user: {}'.format(self.author)) if fix: f = Fix.byNum(fix, self.show) if not f or not f.exists(): raise ValueError( 'No such fix number: {} in show {}'.format( fix, self.show)) else: self.fixId = f.id
def __init__(self, shot, sequence, show=None, clipName=None, author=None, comment=None, start=None, end=None, makeDirs=False, dummy=False): self.table = Snapshot.TABLE self.show = show if show else env.getEnvironment('show') self.sequence = sequence self.shot = shot self._exists = None self.sequenceId = None self.shotId = None self.first_frame = start self.last_frame = end if dummy: return if not self.show: raise ValueError('Tried to fallback to environment-set show, but it was null.') s = Show.fromPk(self.show) if not s: raise ValueError('No such show: {}'.format(show)) if self.sequence is not None: try: self.sequence = int(self.sequence) except ValueError: raise ValueError('Sequence number must be a number, not: {}'.format(self.sequence)) sq = Sequence(self.sequence, show=self.show) if not sq.exists(): raise ValueError('No such sequence {} in show {}'.format(sq.num, sq.show)) else: self.sequenceId = sq.id if self.shot is not None and self.sequence is not None: try: self.shot = int(shot) except ValueError: raise ValueError('Shot number must be a number, not: {}'.format(shot)) sh = Shot(self.shot, self.sequence, show=self.show, clipName=clipName) if not sh.exists(): raise ValueError('No such shot {} in sequence {} in show {}'.format(sh.num, sh.sequence, sh.show)) else: self.shotId = sh.id self.first_frame = self.first_frame if self.first_frame else sh.start self.last_frame = self.last_frame if self.last_frame else sh.end self.num = Snapshot.nextSnapshotNum(self.show, self.sequenceId, self.shotId) fetched = self.exists(fetch=True) if fetched: self.unmap(fetched) self._exists = True else: creationInfo = env.getCreationInfo(format=False) self.comment = comment self.author = author if author else creationInfo[0] self.creation = creationInfo[1] self.first_frame = start self.last_frame = end p = Person(self.author) if not p.exists(): raise ValueError('No such user: {}'.format(self.author)) shotDir = Shot.fromPk(self.shotId).release_path self.file_path = os.path.join(shotDir, '.snapshots', str(self.num)) if makeDirs and not os.path.isdir(self.file_path): os.makedirs(self.file_path)
def accept(self): show = str(self.CMB_show.currentText()) seq = int(str(self.CMB_seq.currentText())) if str(self.CMB_seq.currentText()) and str(self.CMB_seq.currentText()) != '--' else None shotIndex = self.CMB_shot.currentIndex() if str(self.CMB_shot.currentText()) and str(self.CMB_shot.currentText()) != '--' else None shot = self.shots[shotIndex] if shotIndex and self.shots else None elementIndex = self.CMB_asset.currentIndex() if str(self.CMB_asset.currentText()) and str(self.CMB_asset.currentText()) != '--' else None element = self.elements[elementIndex] if elementIndex and self.elements else None username = str(self.LNE_assignTo.text()) fixer = None status = str(self.CMB_status.currentText()) priority = int(self.CMB_priority.currentIndex()) dept = str(self.CMB_dept.currentText()) fixType = str(self.CMB_type.currentText()) if username and len(username) <= 10: fixer = Person(username) deadline = self.DATE_due.date().toPyDate() if self.CHK_due.isChecked() else None if self.fix: # Just update instead of making a new fix if fixType != self.fix.type: self.fix.set('type', fixType) if dept != self.fix.for_dept: self.fix.set('for_dept', dept) if status != self.fix.status: self.fix.set('status', status) if status == 'done': self.fix.set('fix_date', env.getCreationInfo(format=False)[1]) else: self.fix.set('fix_date', None) fixUser = fixer.username if fixer is not None else None if fixUser != self.fix.fixer: self.fix.set('fixer', fixUser) if fixer is not None: self.fix.set('assign_date', env.getCreationInfo(format=False)[1]) self.fix.set('status', 'assigned') else: self.fix.set('assign_date', None) self.fix.set('status', 'new') if priority != self.fix.priority: self.fix.set('priority', priority) if deadline != self.fix.deadline: self.fix.set('deadline', deadline) # Submit comment if text in box comment = str(self.TXT_addComment.toPlainText()) if comment and self.commentHasEntered: self.fix.addComment(comment) QMessageBox.information(self, 'Fix #{}'.format(self.fix.num), 'Changes submitted') else: # There's no command-line api for this because of how cumbersome it would be to type all these parameters from that interface fix = Fix( fixType, str(self.LNE_title.text()), str(self.TXT_body.toPlainText()), dept, show=show, sequence=seq, shot=shot.num if shot else None, clipName=shot.clipName if shot else None, elementName=element.name if element and not element.name.startswith('_') else None, elementType=element.type if element else None, status=status, priority=priority ) if fixer is not None and fixer.exists(): fix.fixer = fixer.username fix.assign_date = fix.creation fix.status = 'assigned' if deadline: fix.deadline = deadline if fix.insert(): QMessageBox.information(self, 'Submitted fix #{}'.format(fix.num), 'Successfully submitted fix!') super(FixDialog, self).accept()
def __init__(self, alias, resolution, fps, name=None, author=None, makeDirs=False, dummy=False): """Construct a new show. Based on the given parameter values, this may equate to a show that already exists in the DB, or will construct an entirely new instance. Args: alias (str): The alias (internal name) of the show resolution (tuple): The image resolution for the show fps (float): The frames per second that the show will follow name (str, optional): The long, descriptive name author (str, optional): The creator of the show, defaults to the current user makeDirs (bool, optional): Whether to make the show's directories on disk, if they don't already exist. dummy (bool, optional): Whether this is a throwaway instance or not. Dummy instances are meant to be "unmapped" into since they will have no attributes set. Raises: ValueError: If the alias specified does not meet the sanitation criteria, or if the given user (if any provided) does not exist in the database already. """ self.table = Show.TABLE if dummy: return sanitary, reasons = utils.isSanitary(alias) if not sanitary: raise ValueError('Invalid alias specified:' + '\n'.join(reasons)) self.alias = alias self._exists = None fetched = self.exists(fetch=True) if fetched: self.unmap(fetched) self._exists = True else: self._exists = False if not isinstance(resolution, tuple) or len(resolution) != 2: raise ValueError( 'Invalid resolution specified, must be a length 2 tuple representing the width and height values' ) self.resolution_x = resolution[0] self.resolution_y = resolution[1] self.fps = fps self.name = name creationInfo = env.getCreationInfo(format=False) self.author = author if author else creationInfo[0] self.creation = creationInfo[1] self.work_path = os.path.join(env.getEnvironment('work'), self.directory) self.release_path = os.path.join(env.getEnvironment('release'), self.directory) p = Person(self.author) if not p.exists(): raise ValueError('No such user: {}'.format(self.author)) if makeDirs: if not os.path.isdir(self.work_path): os.makedirs(self.work_path) if not os.path.isdir(self.release_path): os.makedirs(self.release_path)
def __init__(self, name, elType, show=None, sequence=None, shot=None, clipName=None, author=None, makeDirs=False, dummy=False): self.table = Element.TABLE if dummy: return if name is not None: sanitary, reasons = utils.isSanitary(name, maxChars=25) if not sanitary: raise ValueError('Invalid element name specified:' + '\n'.join(reasons)) self.name = name self.type = elType.lower() self.show = show if show else env.getEnvironment('show') self.sequence = sequence self.shot = shot self._exists = None self.sequenceId = None self.shotId = None if name is None: if shot is None or sequence is None: raise ValueError( 'Element\'s name can only be None (considered nameless) if shot and sequence are also specified' ) else: self.name = '_{}{}{}'.format( fileutils.SEQUENCE_FORMAT.format( str(self.sequence).zfill(env.SEQUENCE_SHOT_PADDING)), fileutils.SHOT_FORMAT.format( str(self.shot).zfill(env.SEQUENCE_SHOT_PADDING)), clipName if clipName else '') if not self.type: raise ValueError('Element\'s type can\'t be None') if self.type not in Element.ELEMENT_TYPES: raise ValueError( 'Invalid element type: {}. Must be one of: {}'.format( self.type, ', '.join(Element.ELEMENT_TYPES))) if not self.show: raise ValueError( 'Tried to fallback to environment-set show, but it was null.') fetched = self.exists(fetch=True) if fetched: self.unmap(fetched) self._exists = True else: creationInfo = env.getCreationInfo(format=False) self.author = author if author else creationInfo[0] self.creation = creationInfo[1] self.status = Element.STATUS[0] self.assigned_to = None self.pubVersion = 0 self.version = 1 self.thumbnail = None self.shot_clipName = clipName s = Show.fromPk(self.show) if not s: raise ValueError('No such show: {}'.format(show)) p = Person(self.author) if not p.exists(): raise ValueError('No such user: {}'.format(self.author)) baseWorkDir = s.work_path baseReleaseDir = s.release_path if self.sequence is not None: try: self.sequence = int(self.sequence) except ValueError: raise ValueError( 'Sequence number must be a number, not: {}'.format( self.sequence)) sq = Sequence(self.sequence, show=self.show) if not sq.exists(): raise ValueError('No such sequence {} in show {}'.format( sq.num, sq.show)) else: self.sequenceId = sq.id baseWorkDir = sq.work_path baseReleaseDir = sq.release_path if self.shot is not None and self.sequence is not None: try: self.shot = int(shot) except ValueError: raise ValueError( 'Shot number must be a number, not: {}'.format(shot)) sh = Shot(self.shot, self.sequence, show=self.show, clipName=self.shot_clipName) if not sh.exists(): raise ValueError( 'No such shot {} in sequence {} in show {}'.format( sh.num, sh.sequence, sh.show)) else: self.shotId = sh.id baseWorkDir = sh.work_path baseReleaseDir = sh.release_path self.work_path = os.path.join(baseWorkDir, self.directory) self.release_path = os.path.join(baseReleaseDir, self.directory) if makeDirs: if not os.path.isdir(self.work_path): os.makedirs(self.work_path) if not os.path.isdir(self.release_path): os.makedirs(self.release_path)
def __init__(self, fixType, title, body, dept, show=None, sequence=None, shot=None, clipName=None, elementName=None, elementType=None, author=None, status=STATUS[0], priority=3, dummy=False): self.table = Fix.TABLE self.commentList = [] if dummy: return self.title = title self.body = body self.show = show if show else env.getEnvironment('show') self.sequence = sequence self.shot = shot self.elementName = elementName self.elementType = elementType self._exists = None self.sequenceId = None self.shotId = None self.elementId = None if not title: raise ValueError('Must specify a fix title') if not body: raise ValueError( 'Must specify details for the fix in the body text') if not self.show: raise ValueError( 'Tried to fallback to environment-set show, but it was null.') fetched = self.exists(fetch=True) if fetched: self.unmap(fetched) self._exists = True else: creationInfo = env.getCreationInfo(format=False) self.type = fixType.lower() self.author = author if author else creationInfo[0] self.creation = creationInfo[1] self.status = status if status in Fix.STATUS.values( ) else Fix.STATUS[0] self.priority = priority if priority in Fix.PRIORITY.keys() else 3 self.fixer = None self.fix_date = None self.deadline = None self.assign_date = None self.num = Fix.nextFixNum(self.show) self.for_dept = dept.lower() if self.type not in Fix.TYPES: raise ValueError('Type must be one of: {}, not: {}'.format( ', '.join(Fix.TYPES, self.type))) if self.for_dept not in env.cfg.departments and self.for_dept != 'general': raise ValueError( 'Invalid department ({}) to assign fix to. Options are: {}' .format(self.for_dept, ', '.join(['general'] + env.cfg.departments))) s = Show.fromPk(self.show) if not s: raise ValueError('No such show: {}'.format(show)) p = Person(self.author) if not p.exists(): raise ValueError('No such user: {}'.format(self.author)) if self.sequence is not None: try: self.sequence = int(self.sequence) except ValueError: raise ValueError( 'Sequence number must be a number, not: {}'.format( self.sequence)) sq = Sequence(self.sequence, show=self.show) if not sq.exists(): raise ValueError('No such sequence {} in show {}'.format( sq.num, sq.show)) else: self.sequenceId = sq.id if self.shot is not None and self.sequence is not None: try: self.shot = int(shot) except ValueError: raise ValueError( 'Sequence number must be a number, not: {}'.format( shot)) sh = Shot(self.shot, self.sequence, show=self.show, clipName=clipName) if not sh.exists(): raise ValueError( 'No such shot {}{} in sequence {} in show {}'.format( sh.num, sh.clipName if sh.clipName else '', sh.sequence, sh.show)) else: self.shotId = sh.id if self.elementType: el = Element(self.elementName, self.elementType, self.show, self.sequence, self.shot) if not el.exists(): raise ValueError( 'No such element {} ({}){}{} in show {}'.format( el.name, el.type, ' in shot {}'.format(el.shot) if el.shot else '', ' in sequence {}'.format(el.sequence) if el.sequence else '', el.show)) else: self.elementId = el.id