def loadGFF_UTR(self,fields,line,transcriptBeginEnd,GFF, transcripts,readOrder,genes): exonBegin=int(fields[3])-1 exonEnd=int(fields[4]) exonScore=fields[5] strand=fields[6] frame=fields[7] transcriptId=None rex=Rex() if(rex.find('transgrp[:=]\s*(\S+)',line)): transcriptId=rex[1] elif(rex.find('transcript_id[:=]?\s*"?([^\s";]+)"?',line)): transcriptId=rex[1] elif(rex.find('Parent=([^;,\s]+)',line)): transcriptId=rex[1] geneId=None if(rex.find('genegrp=(\S+)',line)): geneId=rex[1] elif(rex.find('gene_id[:=]?\s*"?([^\s\;"]+)"?',line)): geneId=rex[1] if(transcriptId is None): transcriptId=geneId if(geneId is None): geneId=transcriptId if(transcriptId is None): raise Exception(line+" : no transcript ID found") if(rex.find("(\S+);$",transcriptId)): transcriptId=rex[1] if(rex.find("(\S+);$",geneId)): geneId=rex[1] extra="" for i in range(8,len(fields)): extra+=fields[i]+" " if(exonBegin>exonEnd): (exonBegin,exonEnd)=(exonEnd,exonBegin) transcript=transcripts.get(transcriptId,None) if(not transcript): transcripts[transcriptId]=transcript= \ Transcript(transcriptId,strand) transcript.setStopCodons(self.stopCodons) transcript.readOrder=readOrder readOrder+=1 transcript.substrate=fields[0] transcript.source=fields[1] if(transcriptBeginEnd.get(transcriptId,None) is not None): (begin,end)=transcriptBeginEnd[transcriptId] transcript.setBegin(begin) transcript.setEnd(end) else: transcript.setBegin(exonBegin) transcript.setEnd(exonEnd) transcript.geneId=geneId gene=genes.get(geneId,None) if(gene is None): genes[geneId]=gene=Gene(); gene.setId(geneId) transcript.setGene(gene) exon=Exon(exonBegin,exonEnd,transcript) exon.extraFields=extra if(transcript.rawExons is not None): exon.frame=frame exon.score=exonScore exon.type=fields[2] transcript.rawExons.append(exon) elif(not transcript.exonOverlapsExon(exon)): exon.frame=frame exon.score=exonScore exon.type=fields[2] transcript.UTR.append(exon) # OK -- we sort later gene.addTranscript(transcript)
def __init__(self, model_arch, model_weight, model_priori_proba_file, fst_folder, acoustic_model_labels_file, words_lexicon_file=Config.RECOGNITION_DIR + "ForcedAlignmnet/words_lexicon.txt", phones_lexicon_file=Config.RECOGNITION_DIR + "ForcedAlignmnet/phones_lexicon.txt", grammerFileName=""): if fst_folder and fst_folder[-1] != '/': fst_folder += "/" self.decoder = Decoder(fst_folder, acoustic_model_labels_file, grammerFileName) self.classifier = Classifier(model_arch, model_weight, model_priori_proba_file) self.trans = Transcript(words_lexicon_file, phones_lexicon_file)
class ASR: def __init__(self, model_arch, model_weight, model_priori_proba_file, fst_folder, acoustic_model_labels_file, words_lexicon_file=Config.RECOGNITION_DIR + "ForcedAlignmnet/words_lexicon.txt", phones_lexicon_file=Config.RECOGNITION_DIR + "ForcedAlignmnet/phones_lexicon.txt", grammerFileName=""): if fst_folder and fst_folder[-1] != '/': fst_folder += "/" self.decoder = Decoder(fst_folder, acoustic_model_labels_file, grammerFileName) self.classifier = Classifier(model_arch, model_weight, model_priori_proba_file) self.trans = Transcript(words_lexicon_file, phones_lexicon_file) def speech_to_text(self, wav_file, max_active_tokens, beam_width, acoustic_model_weigh, latticeBeam=1, include_alignment=False): features = np.transpose(np.array(self._get_features(wav_file))) states_seq = self._decode(features, max_active_tokens, beam_width, acoustic_model_weigh, latticeBeam) if (not include_alignment): states_seq = self._remove_selfloops(states_seq) return ' '.join(self._get_words_from_states_seq(states_seq)) else: frames_count = len(features) return self.trans.get_transcript(states_seq, frames_count) def _decode(self, features, max_active_tokens, beam_width, acoustic_model_weight, latticeBeam): activations = self.classifier.eval(features) return self.decoder.decode(activations, max_active_tokens, beam_width, 1 / acoustic_model_weight, latticeBeam) def _remove_selfloops(self, states_seq): return [ state for i, state in enumerate(states_seq) if not i or states_seq[i][-1] != states_seq[i - 1][-1] ] # remove self loops def _get_words_from_states_seq(self, states_seq): return [ outlabel for _, outlabel, _ in states_seq if not self.decoder.is_special_sym(outlabel) ] def _get_features(self, wav_file): return wav_to_feat(wav_file)
def post(self): """ This method handles a post request to audit a transcript """ args = parser.parse_args() data = ast.literal_eval(args['transcript']) transcript = Transcript(data['major'], data['courses']) degree = degree_catalog.get_degree(data['major']) result = {} audit = transcript.audit_transcript(degree) result['audit'] = audit reccommendations = transcript.reccommend(degree_catalog) result['reccommendations'] = reccommendations return result, 201
def loadGFF_transcript(self,fields,line,transcriptBeginEnd,GFF, transcripts,readOrder,genes): begin=int(fields[3])-1 end=int(fields[4]) rex=Rex() if(rex.find('transcript_id[:=]?\s*"?([^\s";]+)"?',line)): transcriptId=rex[1] transcriptBeginEnd[transcriptId]=[begin,end] strand=fields[6] score=fields[5] transcriptExtraFields="" for i in range(8,len(fields)): transcriptExtraFields+=fields[i]+" " transcript=transcripts.get(transcriptId,None) if(transcript is None): transcripts[transcriptId]=transcript= \ Transcript(transcriptId,strand) transcript.setStopCodons(self.stopCodons) transcript.readOrder=readOrder; readOrder+=1 transcript.substrate=fields[0] transcript.source=fields[1] transcript.setBegin(begin) transcript.setEnd(end) if(transcript.score is None and score!="."): transcript.score=float(score) geneId=None if(rex.find("genegrp=(\S+)",line)): geneId=rex[1] elif(rex.find('gene_id[:=]?\s*\"?([^\s\;"]+)\"?',line)): geneId=rex[1] if(not geneId): raise Exception("can't parse GTF: "+line) transcript.geneId=geneId gene=genes.get(geneId,None) if(not gene): genes[geneId]=gene=Gene(); gene.setId(geneId) transcript.setGene(gene) gene.addTranscript(transcript) transcript.extraFields=transcriptExtraFields
return None #============================= main() ================================= parser=EssexParser(infile) while(True): report=parser.nextElem() if(not report): break statusNode=report.findChild("status"); if(not statusNode): continue siteType="donor" brokenNode=statusNode.findChild("broken-donor") if(not brokenNode): siteType="acceptor" brokenNode=statusNode.findChild("broken-acceptor") if(not brokenNode): continue sitePos=int(brokenNode.getIthElem(0)) geneID=report.getAttribute("gene-ID") transID=report.getAttribute("transcript-ID") mappedNode=report.findChild("mapped-transcript") strand=mappedNode.getAttribute("strand") mappedTranscript=Transcript(mappedNode) mappedExons=mappedTranscript.getRawExons() mappedExons.sort(key=lambda exon: exon.begin) interval=getInterval(sitePos,mappedExons) #if(interval is None): print(mappedTranscript.toGff()) if(interval is None): continue print(indiv,hap,geneID,transID,strand,interval.exon,siteType, interval.begin,sitePos,interval.end,sep="\t",flush=True)
def assembleTranscriptome(self): """ Loop over uniqueGeneSet, in which the ENSG-IDs are saved, and assemble all the transcripts and exons for this gene and save it as a Gene object. This gene obeject ist then added to the geneList of this Genome object """ # transcriptsByType = defaultdict(list) # construct Genes for uniqGene in self.uniqGeneSet: geneId, chromosome, strand = uniqGene geneNames = list(self.uniqGene_to_names[uniqGene]) geneType = self.uniqGene_to_source[uniqGene] geneExons = set() geneCds = set() # get exons from all transcripts for transcriptId in self.uniqGene_to_transcriptIds[uniqGene]: geneExons |= self.transcriptId_to_exons[ transcriptId] # add new exon tuples to geneExons set geneCds |= self.transcriptId_to_cds[transcriptId] # usually gtf Files are sorted, but this can't be assumed geneExons = sorted(geneExons, reverse=not strand) geneCds = sorted(geneCds, reverse=not strand) gene = Gene(geneId, chromosome, strand, geneType, geneNames, geneExons, geneCds) geneExons = dict(zip(geneExons, xrange(1000000))) geneCds = dict(zip(geneCds, xrange(1000000))) self.geneList.append(gene) # construct transcripts for transcriptId in self.uniqGene_to_transcriptIds[uniqGene]: transcriptNames = self.transcriptId_to_names[transcriptId] protId = self.transcriptId_to_protId[ transcriptId] if transcriptId in self.transcriptId_to_protId else None exons = sorted(self.transcriptId_to_exons[transcriptId]) codingExons = sorted(self.transcriptId_to_cds[transcriptId]) exonIndices = array('H', [geneExons[e] for e in exons]) codingExonIndices = array('H', [geneCds[e] for e in codingExons]) codingFrames = array('H', [ int(frame) for exonNumber, frame in sorted( self.transcriptId_to_codingFrames[transcriptId]) ]) startCodon = tuple([ interval for exonNumber, interval in sorted( self.transcriptId_to_startCodons[transcriptId]) ]) stopCodon = tuple([ interval for exonNumber, interval in sorted( self.transcriptId_to_stopCodons[transcriptId]) ]) if len(codingExons) != len(codingFrames): raise Exception( "Number of coding Exons and Frames differ for %s %s" % geneId, transcriptId) transcript = Transcript(gene, transcriptId, list(transcriptNames), protId, exonIndices, codingExonIndices, codingFrames, startCodon, stopCodon) gene.addTranscript(transcript)
class ByuSession: def __init__(self, username, password): # Check to make sure all information is present if not username or not password: raise ByuSessionError("Please enter a username and password to continue.") self.username = username.lower().strip() self.password = password self.transcript = [] self.parsed_transcript = None self.session = None self.semesters = [] def signIn(self): sys.stdout.write("Logging in... ") session_requests = requests.session() login_url = "https://cas.byu.edu/cas/login?service=https://my.byu.edu/uPortal/Login" result = session_requests.get(login_url) # Must return a HTTP 200 code if str(result.status_code)[0] is not "2": raise ByuSessionError("Could not gather CAS login page. HTTP error Code: " + str(result.status_code)) tree = html.fromstring(result.text) execution = list(set(tree.xpath("//input[@name='execution']/@value")))[0] lt = list(set(tree.xpath("//input[@name='lt']/@value")))[0] # Prepare http post data payload = { "username": self.username, "password": self.password, "execution": execution, "lt": lt, "_eventId": "submit" } # Post the credentials result = session_requests.post( login_url, data = payload, headers = dict(referer=login_url) ) # Must return a HTTP 200 code if str(result.status_code)[0] is not "2": raise ByuSessionError("Login failed. Please check your username and password. HTTP error Code: " + str(result.status_code)) if "Unable to sign in:" in result.text: raise ByuSessionError("Login failed. Please check your username and password.") self.session = session_requests sys.stdout.flush() sys.stdout.write("Done.\n") def getTranscript(self): sys.stdout.write("Retreiving transcript... ") if self.session is None: raise ByuSessionError("Please sign in first.") return url = 'https://y.byu.edu/ry/ae/prod/records/cgi/stdCourseWork.cgi' result = self.session.get( url, headers = dict(referer = url) ) # Must return a HTTP 200 code if str(result.status_code)[0] is not "2": raise ByuSessionError("The transcript page returned with errors. HTTP error Code: " + str(result.status_code)) tree = html.fromstring(result.content) elem = tree.xpath("//pre/descendant-or-self::text()") for x in elem: self.transcript.append(x.replace("\\n", "\n")) if not self.transcript: raise ByuSessionError("The transcript could not be collected.\n***Please check your username and password.***") sys.stdout.flush() sys.stdout.write("Done.\n") def getAndParseTranscript(self): # If the transcript has not been collected yet, get it if not self.transcript: self.signIn() self.getTranscript() # Patterns to look for in the transcript semester_start_pattern = re.compile("((?:Fall|Winter|Spring|Summer)\s(?:Semester|Term)\s[0-9]{4}).*") current_semester_signifier = re.compile("(?:CURRENT ENROLLMENT).*") transfer_credits_start = re.compile("(?:YRTRM).*") end_pattern = re.compile("(?:SEM|TRN|--------------------------------------------------------------).*") past_class_pattern = re.compile("[\s\S]{6}(?:[0-9]{3}|[0-9]{3}[A-Z])\s+[0-9]{3}[\s\S]{42}[0-9]\.[0-9]{2}.*[A-P|W][+-]?") current_class_pattern = re.compile("[\s\S]{6}(?:[0-9]{3}|[0-9]{3}[A-Z])\s+[0-9]{3}[\s\S]{42}[0-9]\.[0-9]{2}") start_semester = False start_current_semester = False transfer_semester = False semesters = [] recording_semester = "" # Otherwise, only get the current semester for line in self.transcript: # End of semester, current semester, and transfer credits if end_pattern.match(line.strip()) and start_semester: start_semester = False semesters.append(recording_semester) # Current semester sigifier elif current_semester_signifier.match(line): start_current_semester = True # Start of any semester elif semester_start_pattern.match(line): start_semester = True semester_name = line.split() # [name] Semester [year] recording_semester = Semester(semester_name[0], semester_name[2], start_current_semester) # Append class to semester elif start_semester: line = line.strip() if not start_current_semester: recording_semester.addClass(self.parsePastClass(line)) else: if past_class_pattern.match(line): recording_semester.addClass(self.parsePastClass(line)) else: recording_semester.addClass(self.parseCurrentClass(line)) elif transfer_credits_start.match(line.strip()): # Transfer credits print "Transfer Credits Started!: ", line transfer_semester = True recording_semester = Semester("Transfer", "N/A", False) elif end_pattern.match(line.strip()) and transfer_semester: # Transfer credits ended print "Transfer Credits Ended: ", line transfer_semester = False semesters.append(recording_semester) elif transfer_semester: # Record transfer semester print "Transfer Line: ", line recording_semester.addClass(self.parseTransferClass(line)) if not semesters: raise ByuSessionError("There are no classes listed for the selected semester.\nIf you are receiving this message in error, please try again.") self.parsed_transcript = Transcript(semesters) return self.parsed_transcript def getTargetSemester(self, semester_name, year): semester_name = semester_name.lower().capitalize() if semester_name == "Semester" or (semester_name != "All" and not year): raise ByuSessionError("Please enter a valid semester and year to continue.") if not self.transcript: self.getAndParseTranscript() # If all semesters are selected, print entire thing if semester_name == "All": return self.parsed_transcript else: return self.parsed_transcript.getSemester(semester_name, year) def parsePastClass(self, aClass): aClass_list = self.parseClass(aClass, 2) department = aClass_list[0] number = aClass_list[1] section = aClass_list[2] name = aClass_list[3] points_total = aClass_list[4] grade = aClass_list[5] # Combine classes return Class(department, number, int(section), name, float(points_total), grade) def parseCurrentClass(self, aClass): aClass_list = self.parseClass(aClass, 1) department = aClass_list[0] number = aClass_list[1] section = aClass_list[2] name = aClass_list[3] points_total = aClass_list[4] # Combine classes return Class(department, number, int(section), name, float(points_total)) def parseClass(self, aClass, parse_offset): aClass_list = aClass.split() # Check for department name in first indexes if not aClass_list[1][0].isdigit(): aClass_list[0:2] = [" ".join(aClass_list[0:2])] # Merge class description aClass_list[3:(len(aClass_list) - parse_offset)] = [" ".join(aClass_list[3:(len(aClass_list) - parse_offset)])] return aClass_list def parseTransferClass(self, aClass): credits_pattern = re.compile("[0-9][.][0-9]{2}") grades_pattern = re.compile("\s[A-F][\-|\+]?\s") aClass_list = aClass.split() department = aClass_list[1] number = aClass_list[2] section = 000 name = "" finished = False for item in aClass_list[3:]: if not finished: for letter in item: if letter.isdigit(): finished = True break if not finished: name = name + " " + item credit_hours = float(credits_pattern.search(aClass).group(0)) letter_grade = grades_pattern.search(aClass).group(0).strip() print "Credit Hours: ", str(credit_hours), "\nLetter Grade: ", str(letter_grade) return Class(department, number, section, name, credit_hours, letter_grade)
def getAndParseTranscript(self): # If the transcript has not been collected yet, get it if not self.transcript: self.signIn() self.getTranscript() # Patterns to look for in the transcript semester_start_pattern = re.compile("((?:Fall|Winter|Spring|Summer)\s(?:Semester|Term)\s[0-9]{4}).*") current_semester_signifier = re.compile("(?:CURRENT ENROLLMENT).*") transfer_credits_start = re.compile("(?:YRTRM).*") end_pattern = re.compile("(?:SEM|TRN|--------------------------------------------------------------).*") past_class_pattern = re.compile("[\s\S]{6}(?:[0-9]{3}|[0-9]{3}[A-Z])\s+[0-9]{3}[\s\S]{42}[0-9]\.[0-9]{2}.*[A-P|W][+-]?") current_class_pattern = re.compile("[\s\S]{6}(?:[0-9]{3}|[0-9]{3}[A-Z])\s+[0-9]{3}[\s\S]{42}[0-9]\.[0-9]{2}") start_semester = False start_current_semester = False transfer_semester = False semesters = [] recording_semester = "" # Otherwise, only get the current semester for line in self.transcript: # End of semester, current semester, and transfer credits if end_pattern.match(line.strip()) and start_semester: start_semester = False semesters.append(recording_semester) # Current semester sigifier elif current_semester_signifier.match(line): start_current_semester = True # Start of any semester elif semester_start_pattern.match(line): start_semester = True semester_name = line.split() # [name] Semester [year] recording_semester = Semester(semester_name[0], semester_name[2], start_current_semester) # Append class to semester elif start_semester: line = line.strip() if not start_current_semester: recording_semester.addClass(self.parsePastClass(line)) else: if past_class_pattern.match(line): recording_semester.addClass(self.parsePastClass(line)) else: recording_semester.addClass(self.parseCurrentClass(line)) elif transfer_credits_start.match(line.strip()): # Transfer credits print "Transfer Credits Started!: ", line transfer_semester = True recording_semester = Semester("Transfer", "N/A", False) elif end_pattern.match(line.strip()) and transfer_semester: # Transfer credits ended print "Transfer Credits Ended: ", line transfer_semester = False semesters.append(recording_semester) elif transfer_semester: # Record transfer semester print "Transfer Line: ", line recording_semester.addClass(self.parseTransferClass(line)) if not semesters: raise ByuSessionError("There are no classes listed for the selected semester.\nIf you are receiving this message in error, please try again.") self.parsed_transcript = Transcript(semesters) return self.parsed_transcript
def makeTranscript(self,root): id=root["extra"]["ID"] strand=root["strand"] transcript=Transcript(id,strand) root["object"]=transcript transcript.substrate=root["substrate"] transcript.source=root["source"] transcript.begin=int(root["begin"]) transcript.end=int(root["end"]) children=root.get("children",None) if(children is None): return transcript for child in children: obj=self.labelStructure(child) if(obj is None): continue if(type(obj)==Exon): childType=child["type"] if(childType=="CDS" or re.search("-exon",childType)): transcript.addExon(obj) elif(childType=="exon"): transcript.addRawExon(obj) elif(re.search("UTR",childType)): transcript.addUTR(obj) obj.transcript=transcript transcript.parseRawExons() transcript.setExonTypes() transcript.setUTRtypes() transcript.sortExons() transcript.adjustOrders() extra=root["extra"] transcript.extraFields="" for key in extra: transcript.extraFields+=key+"="+extra[key]+";" return transcript
def get_transcripts_list(paths): # Get list of sorted Transcript files transcripts = [] for path in sorted_paths(paths): transcripts.append(Transcript(path)) return transcripts
import ast app = Flask(__name__) cors = CORS(app) api = Api(app) parser = reqparse.RequestParser() parser.add_argument('transcript') course_catalog = CourseCatalog() course_catalog.load_courses('coursecatalog.csv') degree_catalog = DegreeCatalog() degree_catalog.load_degrees('degrees.json') test_transcript = Transcript('ComputerScienceBA') test_transcript.load_transcript('transcriptExample.json') test_degree = degree_catalog.get_degree('ComputerScienceBA') test_transcript.reccommend(degree_catalog) #print(test_transcript.audit_transcript(degree_catalog.get_degree('Manangement Information System Major'))) #print(res) class HelloWorld(Resource): """ Test REST Endpoint """ def get(self):
class MainWindow(QtWidgets.QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.transcript = Transcript() self.student_info = StudentInfo() self.selected_department = "" self.selectable_courses = {} self.current_season = "" self.resize(510, 700) self.setFixedWidth(510) self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowMinimizeButtonHint) self.menu_bar = QtWidgets.QMenuBar() self.file_menu = QtWidgets.QMenu("Dosya") self.open = self.file_menu.addAction("Aç") self.save = self.file_menu.addAction("Kaydet") self.save_as = self.file_menu.addAction("Farklı Kaydet") self.menu_bar.addMenu(self.file_menu) self.setMenuBar(self.menu_bar) user_name_label = QtWidgets.QLabel("Kullanıcı adı:") self.user_name_show_label = QtWidgets.QLabel("") self.user_select_button = QtWidgets.QPushButton("Transcript Yükle") user_layout = QtWidgets.QHBoxLayout() user_layout.addWidget(user_name_label, 0) user_layout.addWidget(self.user_name_show_label, 1) user_layout.addWidget(self.user_select_button, 2) code_select_label = QtWidgets.QLabel("Bölüm Kodu Seç") code_select_label.setMaximumSize(110, 25) education_year_label = QtWidgets.QLabel("Eğitim Yılını Seç") education_season_label = QtWidgets.QLabel("Eğitim Dönemini Seç") education_season_label.setMaximumSize(150, 25) self.code_select_cbox = QtWidgets.QComboBox() self.code_select_cbox.addItem("Seç") self.code_select_cbox.setFixedSize(100, 25) self.education_season_cbox = QtWidgets.QComboBox() self.education_year_cbox = QtWidgets.QComboBox() self.season_select = QtWidgets.QPushButton("Seç") hor_spacer = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding) top_grid_layout = QtWidgets.QGridLayout() top_grid_layout.addWidget(code_select_label, 0, 0) top_grid_layout.addWidget(self.code_select_cbox, 0, 1) top_grid_layout.addItem(hor_spacer, 0, 2) top_grid_layout.addWidget(education_year_label, 0, 3) top_grid_layout.addWidget(self.education_year_cbox, 0, 4) top_grid_layout.addWidget(education_season_label, 1, 3) top_grid_layout.addWidget(self.education_season_cbox, 1, 4) top_grid_layout.addWidget(self.season_select, 2, 4) self.course_table = QtWidgets.QTableWidget() self.course_table.setColumnCount(8) self.course_table.setFixedWidth(438) self.course_table.setColumnHidden(4, True) self.course_table.setColumnHidden(5, True) self.course_table.setColumnHidden(6, True) self.course_table.setColumnHidden(7, True) course_code_label = QtWidgets.QLabel("Ders Kodu") course_num_label = QtWidgets.QLabel("Ders Numarası") not_label = QtWidgets.QLabel("Not") gen_not_ort_label = QtWidgets.QLabel("Genel Not Ortalaması:") self.gpa_show_label = QtWidgets.QLabel() self.course_code_cbox = QtWidgets.QComboBox() self.course_code_cbox.addItem("Seç") self.course_num_cbox = QtWidgets.QComboBox() self.course_num_cbox.addItem("Seç") self.grade_cbox = QtWidgets.QComboBox() self.grade_cbox.addItem("Seç") self.gpa_show_label = QtWidgets.QLabel() self.remove_course_button = QtWidgets.QPushButton( "Seçilen Dersi Çıkar") bottom_grid_layout = QtWidgets.QGridLayout() bottom_grid_layout.addWidget(course_code_label, 0, 0) bottom_grid_layout.addWidget(self.course_code_cbox, 0, 1) bottom_grid_layout.addWidget(self.remove_course_button, 0, 3) bottom_grid_layout.addWidget(course_num_label, 1, 0) bottom_grid_layout.addWidget(self.course_num_cbox, 1, 1) bottom_grid_layout.addWidget(gen_not_ort_label, 1, 2) bottom_grid_layout.addWidget(self.gpa_show_label, 1, 3) bottom_grid_layout.addWidget(not_label, 2, 0) bottom_grid_layout.addWidget(self.grade_cbox, 2, 1) self.add = QtWidgets.QPushButton("Ders Ekle") bottom_hor_layout = QtWidgets.QHBoxLayout() bottom_hor_layout.addWidget(self.add) main_layout = QtWidgets.QVBoxLayout() main_layout.addLayout(user_layout, 0) main_layout.addLayout(top_grid_layout, 1) main_layout.addWidget(self.course_table, 2) main_layout.addLayout(bottom_grid_layout, 3) main_layout.addLayout(bottom_hor_layout, 4) self.central_widget = QtWidgets.QWidget() self.central_widget.setLayout(main_layout) self.setCentralWidget(self.central_widget) self.setWindowTitle("İTÜ Ortalama Hesaplayıcı") QtCore.QObject.connect(self.code_select_cbox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.read_selected_department) QtCore.QObject.connect(self.course_code_cbox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_course_num_cbox) QtCore.QObject.connect(self.education_year_cbox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_education_season_cbox) QtCore.QObject.connect(self.season_select, QtCore.SIGNAL("clicked()"), self.add_season) QtCore.QObject.connect(self.add, QtCore.SIGNAL("clicked()"), self.add_course) QtCore.QObject.connect(self.remove_course_button, QtCore.SIGNAL("clicked()"), self.remove_row) if self.get_transcript_data(): self.write_transcript_table() self.set_education_year_cbox() self.set_gpa_show_label() self.set_code_select_cbox(save_data.read_verify_departments_code()) self.set_grade_cbox() self.set_user_name_label() def set_code_select_cbox(self, departments: dict): for code in sorted(list(departments.values())): self.code_select_cbox.addItem(code) def set_course_code_cbox(self): self.course_code_cbox.clear() self.course_code_cbox.addItem("Seç") for code in sorted(self.selectable_courses.keys()): self.course_code_cbox.addItem(code) def set_course_num_cbox(self): department_code = self.course_code_cbox.currentText() self.course_num_cbox.clear() self.course_num_cbox.addItem("Seç") if department_code not in ["", "Seç"]: for code in sorted(set(self.selectable_courses[department_code])): self.course_num_cbox.addItem(code) def set_grade_cbox(self): for grades in ["AA", "BA", "BB", "CB", "CC", "DC", "DD", "FF", "VF"]: self.grade_cbox.addItem(grades) def set_education_year_cbox(self): years = self.calculate_years() for year in years: self.education_year_cbox.addItem(year) def set_education_season_cbox(self): self.education_season_cbox.clear() seasons = ["Güz", "Bahar", "Yaz Öğretimi"] education_year = self.education_year_cbox.currentText() last_season = self.transcript.get_last_season() last_year = last_season[:9] if education_year == last_year: for i in range(seasons.index(last_season[12:]) + 1, 3): self.education_season_cbox.addItem(seasons[i]) else: for season in seasons: self.education_season_cbox.addItem(season) def set_gpa_show_label(self): self.gpa_show_label.setText(str(round(self.transcript.get_gpa(), 2))) def set_rows_header(self): course_counter = 1 for i in range(self.course_table.rowCount()): item = QtWidgets.QTableWidgetItem() if self.course_table.item(i, 5).text() == "Course": item.setText(str(course_counter)) course_counter += 1 else: item.setBackgroundColor(QtGui.QColor(QtCore.Qt.gray)) item.setText("") self.course_table.setVerticalHeaderItem(i, item) def set_user_name_label(self): self.user_name_show_label.setText(self.transcript.user_name) def calculate_years(self): last_season = self.transcript.get_last_season() years = [] if last_season[12:] != "Yaz Öğretimi": first_ind = 0 else: first_ind = 1 for i in range(first_ind, 5): years.append( str(int(last_season[:4]) + i) + "-" + str(int(last_season[5:9]) + i)) return years def read_selected_department(self): self.selected_department = self.code_select_cbox.currentText() self.selectable_courses = curriculums.parse_courses_code( self.selected_department) self.set_course_code_cbox() def read_course_code_cbox(self): return self.course_code_cbox.currentText() def read_course_num_cbox(self): return self.course_num_cbox.currentText() def read_grade_cbox(self): return self.grade_cbox.currentText() def add_row(self, row_data, row_number=None): if not row_number: row_number = self.course_table.rowCount() if row_data[5] == "Course": self.add_course_row(row_data, row_number) elif row_data[5] == "Season": self.add_season_row(row_data, row_number) def add_season_row(self, row_data, row_number): self.course_table.insertRow(row_number) for i, data in enumerate(row_data): item = QtWidgets.QTableWidgetItem(str(data)) item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) item.setBackgroundColor(QtGui.QColor(QtCore.Qt.gray)) self.course_table.setItem(row_number, i, item) def add_course_row(self, row_data, row_number): self.course_table.insertRow(row_number) for i, data in enumerate(row_data): if row_data[4] and i == 3: grade_cbox = QtWidgets.QComboBox() if row_data[7]: grade_cbox.setEnabled(False) grade_cbox.addItem(data) else: if int(row_data[2]): for grades in [ "AA", "BA", "BB", "CB", "CC", "DC", "DD", "FF", "VF" ]: grade_cbox.addItem(grades) else: for grades in ["BZ", "BL"]: grade_cbox.addItem(grades) grade_cbox.setCurrentText(data.strip()) self.course_table.setCellWidget(row_number, i, grade_cbox) QtCore.QObject.connect( self.course_table.cellWidget(row_number, i), QtCore.SIGNAL("currentIndexChanged(QString)"), self.update_course_data) else: item = QtWidgets.QTableWidgetItem(str(data)) item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) self.course_table.setItem(row_number, i, item) def add_season(self): education_year = self.education_year_cbox.currentText() education_season = self.education_season_cbox.currentText() season = education_year + " / " + education_season self.current_season = season try: self.transcript.add_season(season) self.write_transcript_table() except IntegrityError: pass def add_course(self): if not self.current_season: QtWidgets.QMessageBox.information(self, "Hata", "Önce Dönem Seçin!", QtWidgets.QMessageBox.Ok) else: course_code = self.read_course_code_cbox() if course_code == "Seç": QtWidgets.QMessageBox.information(self, "Hata", "Ders Kodu Seçin", QtWidgets.QMessageBox.Ok) return False course_num = self.read_course_num_cbox() if course_num == "Seç": QtWidgets.QMessageBox.information(self, "Hata", "Ders No Seçin", QtWidgets.QMessageBox.Ok) return False course_grade = self.read_grade_cbox() if course_grade == "Seç": QtWidgets.QMessageBox.information(self, "Hata", "Ders Notu Seçin", QtWidgets.QMessageBox.Ok) return False course_data = self.find_course_data(course_code + " " + course_num) data = [ course_data["Ders Kodu"], course_data["Ders Adı"], course_data["Kredi"], course_grade, 0, self.current_season ] try: self.transcript.check_course_before_added(data[0]) self.transcript.add_course(data) self.write_transcript_table() self.set_gpa_show_label() except IntegrityError: QtWidgets.QMessageBox.information( self, "Hata", "Bir Döneme Aynı Dersten İki Tane Eklenemez", QtWidgets.QMessageBox.Ok) def write_transcript_table(self): self.course_table.clear() self.course_table.setRowCount(0) transcript_data = self.transcript.get_transcript_data() for row in transcript_data: self.add_row(row) self.set_rows_header() self.course_table.setHorizontalHeaderItem( 0, QtWidgets.QTableWidgetItem("Ders Kodu")) self.course_table.setHorizontalHeaderItem( 1, QtWidgets.QTableWidgetItem("Ders İsmi")) self.course_table.setHorizontalHeaderItem( 2, QtWidgets.QTableWidgetItem("Kredi")) self.course_table.setHorizontalHeaderItem( 3, QtWidgets.QTableWidgetItem("Not")) self.course_table.setHorizontalHeaderItem( 4, QtWidgets.QTableWidgetItem("Editable")) self.course_table.setHorizontalHeaderItem( 5, QtWidgets.QTableWidgetItem("Tag")) self.course_table.setHorizontalHeaderItem( 6, QtWidgets.QTableWidgetItem("Season Name")) self.course_table.setHorizontalHeaderItem( 7, QtWidgets.QTableWidgetItem("Passive")) def find_course_data(self, course_code): department_code = self.code_select_cbox.currentText() courses = save_data.read_elective_courses( department_code) + save_data.read_departments_curriculum( department_code) for item in courses: key = item["Ders Kodu"] if course_code == key or course_code[: -1] == key or course_code == key[: -1]: item["Ders Kodu"] = course_code return item return {} def update_course_data(self): table_data = [] for row in reversed(range(self.course_table.rowCount())): if self.course_table.item(row, 4).text() == '0': break elif self.course_table.item(row, 5).text() == "Season": continue table_data.append([ self.course_table.cellWidget(row, 3).currentText(), self.course_table.item(row, 6).text() ]) db_data = self.transcript.get_editable_data() for i, course in enumerate(reversed(db_data)): if table_data[i][0] != course[1].strip(): self.transcript.update_course(table_data[i][1], course[0], table_data[i][0]) self.transcript.update_season_gpa(table_data[i][1]) self.update_season_gpa(table_data[i][1]) break self.set_gpa_show_label() def update_season_gpa(self, season_name): gpa = self.transcript.get_season_gpa(season_name) for row in reversed(range(self.course_table.rowCount())): if self.course_table.item(row, 5).text() == "Season" \ and self.course_table.item(row, 0).text() == season_name[:9] \ and self.course_table.item(row, 1).text() == season_name[12:]: item = self.course_table.takeItem(row, 3) item.setText(str(gpa)) self.course_table.setItem(row, 3, item) def remove_row(self): current_row = self.course_table.currentRow() if self.course_table.item(current_row, 4).text() == "0": QtWidgets.QMessageBox.information(self, "Hata", "Bu Satırı Silemezsiniz.", QtWidgets.QMessageBox.Ok) return if self.course_table.item(current_row, 5).text() == "Course": self.transcript.delete_course( self.course_table.item(current_row, 6).text(), self.course_table.item(current_row, 0).text()) self.transcript.update_season_gpa( self.course_table.item(current_row, 6).text()) self.transcript.update_season_credit( self.course_table.item(current_row, 6).text()) self.write_transcript_table() self.set_gpa_show_label() else: self.transcript.delete_season( self.course_table.item(current_row, 6).text()) self.write_transcript_table() self.set_gpa_show_label() def get_transcript_data(self): self.student_info.reset_student_info() self.student_info.show() if self.student_info.exec_() == QtWidgets.QDialog.Accepted: self.transcript.set_user_name(self.student_info.user_name) self.transcript.set_path(self.student_info.path) self.user_name_show_label.setText(self.transcript.user_name) return 1 else: return 0
def __init__(self): super(MainWindow, self).__init__() self.transcript = Transcript() self.student_info = StudentInfo() self.selected_department = "" self.selectable_courses = {} self.current_season = "" self.resize(510, 700) self.setFixedWidth(510) self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowMinimizeButtonHint) self.menu_bar = QtWidgets.QMenuBar() self.file_menu = QtWidgets.QMenu("Dosya") self.open = self.file_menu.addAction("Aç") self.save = self.file_menu.addAction("Kaydet") self.save_as = self.file_menu.addAction("Farklı Kaydet") self.menu_bar.addMenu(self.file_menu) self.setMenuBar(self.menu_bar) user_name_label = QtWidgets.QLabel("Kullanıcı adı:") self.user_name_show_label = QtWidgets.QLabel("") self.user_select_button = QtWidgets.QPushButton("Transcript Yükle") user_layout = QtWidgets.QHBoxLayout() user_layout.addWidget(user_name_label, 0) user_layout.addWidget(self.user_name_show_label, 1) user_layout.addWidget(self.user_select_button, 2) code_select_label = QtWidgets.QLabel("Bölüm Kodu Seç") code_select_label.setMaximumSize(110, 25) education_year_label = QtWidgets.QLabel("Eğitim Yılını Seç") education_season_label = QtWidgets.QLabel("Eğitim Dönemini Seç") education_season_label.setMaximumSize(150, 25) self.code_select_cbox = QtWidgets.QComboBox() self.code_select_cbox.addItem("Seç") self.code_select_cbox.setFixedSize(100, 25) self.education_season_cbox = QtWidgets.QComboBox() self.education_year_cbox = QtWidgets.QComboBox() self.season_select = QtWidgets.QPushButton("Seç") hor_spacer = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding) top_grid_layout = QtWidgets.QGridLayout() top_grid_layout.addWidget(code_select_label, 0, 0) top_grid_layout.addWidget(self.code_select_cbox, 0, 1) top_grid_layout.addItem(hor_spacer, 0, 2) top_grid_layout.addWidget(education_year_label, 0, 3) top_grid_layout.addWidget(self.education_year_cbox, 0, 4) top_grid_layout.addWidget(education_season_label, 1, 3) top_grid_layout.addWidget(self.education_season_cbox, 1, 4) top_grid_layout.addWidget(self.season_select, 2, 4) self.course_table = QtWidgets.QTableWidget() self.course_table.setColumnCount(8) self.course_table.setFixedWidth(438) self.course_table.setColumnHidden(4, True) self.course_table.setColumnHidden(5, True) self.course_table.setColumnHidden(6, True) self.course_table.setColumnHidden(7, True) course_code_label = QtWidgets.QLabel("Ders Kodu") course_num_label = QtWidgets.QLabel("Ders Numarası") not_label = QtWidgets.QLabel("Not") gen_not_ort_label = QtWidgets.QLabel("Genel Not Ortalaması:") self.gpa_show_label = QtWidgets.QLabel() self.course_code_cbox = QtWidgets.QComboBox() self.course_code_cbox.addItem("Seç") self.course_num_cbox = QtWidgets.QComboBox() self.course_num_cbox.addItem("Seç") self.grade_cbox = QtWidgets.QComboBox() self.grade_cbox.addItem("Seç") self.gpa_show_label = QtWidgets.QLabel() self.remove_course_button = QtWidgets.QPushButton( "Seçilen Dersi Çıkar") bottom_grid_layout = QtWidgets.QGridLayout() bottom_grid_layout.addWidget(course_code_label, 0, 0) bottom_grid_layout.addWidget(self.course_code_cbox, 0, 1) bottom_grid_layout.addWidget(self.remove_course_button, 0, 3) bottom_grid_layout.addWidget(course_num_label, 1, 0) bottom_grid_layout.addWidget(self.course_num_cbox, 1, 1) bottom_grid_layout.addWidget(gen_not_ort_label, 1, 2) bottom_grid_layout.addWidget(self.gpa_show_label, 1, 3) bottom_grid_layout.addWidget(not_label, 2, 0) bottom_grid_layout.addWidget(self.grade_cbox, 2, 1) self.add = QtWidgets.QPushButton("Ders Ekle") bottom_hor_layout = QtWidgets.QHBoxLayout() bottom_hor_layout.addWidget(self.add) main_layout = QtWidgets.QVBoxLayout() main_layout.addLayout(user_layout, 0) main_layout.addLayout(top_grid_layout, 1) main_layout.addWidget(self.course_table, 2) main_layout.addLayout(bottom_grid_layout, 3) main_layout.addLayout(bottom_hor_layout, 4) self.central_widget = QtWidgets.QWidget() self.central_widget.setLayout(main_layout) self.setCentralWidget(self.central_widget) self.setWindowTitle("İTÜ Ortalama Hesaplayıcı") QtCore.QObject.connect(self.code_select_cbox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.read_selected_department) QtCore.QObject.connect(self.course_code_cbox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_course_num_cbox) QtCore.QObject.connect(self.education_year_cbox, QtCore.SIGNAL("currentIndexChanged(QString)"), self.set_education_season_cbox) QtCore.QObject.connect(self.season_select, QtCore.SIGNAL("clicked()"), self.add_season) QtCore.QObject.connect(self.add, QtCore.SIGNAL("clicked()"), self.add_course) QtCore.QObject.connect(self.remove_course_button, QtCore.SIGNAL("clicked()"), self.remove_row) if self.get_transcript_data(): self.write_transcript_table() self.set_education_year_cbox() self.set_gpa_show_label() self.set_code_select_cbox(save_data.read_verify_departments_code()) self.set_grade_cbox() self.set_user_name_label()
def makeTranscript(self, root): id = root["extra"]["ID"] strand = root["strand"] transcript = Transcript(id, strand) root["object"] = transcript transcript.substrate = root["substrate"] transcript.source = root["source"] transcript.begin = int(root["begin"]) transcript.end = int(root["end"]) children = root.get("children", None) if (children is None): return transcript for child in children: obj = self.labelStructure(child) if (obj is None): continue if (type(obj) == Exon): childType = child["type"] if (childType == "CDS" or re.search("-exon", childType)): transcript.addExon(obj) elif (childType == "exon"): transcript.addRawExon(obj) elif (re.search("UTR", childType)): transcript.addUTR(obj) obj.transcript = transcript transcript.parseRawExons() transcript.setExonTypes() transcript.setUTRtypes() transcript.sortExons() transcript.adjustOrders() extra = root["extra"] transcript.extraFields = "" for key in extra: transcript.extraFields += key + "=" + extra[key] + ";" return transcript