def setValue(self, path, option, category='text'): option = getattr(self, option) if category == 'text': val = option.text() if category == 'bool': val = option.isChecked() if category == 'combox': val = option.currentText() if category == 'slider': val = option.value() if category == 'plaintext': val = option.toPlainText() if category == 'list': items = [option.item(i).text() for i in range(option.count())] val = json.dumps(items) if category == 'mobile': name = option.currentText() person = db.query(User).filter_by(name=name).first() val = person.mobile if person else '' conf.setValue(path, val)
def autoSend(self): tasks = db.query(Task).filter_by(taf_id=None).order_by( Task.planning).all() now = datetime.datetime.utcnow() sendStatus = False for task in tasks: if task.planning <= now: message = '\n'.join([task.head, task.rpt]) aftn = AFTNMessage(message, time=task.planning) item = Taf(tt=task.tt, sign=task.head, rpt=task.rpt, raw=aftn.toJson()) db.add(item) db.flush() task.taf_id = item.id db.merge(task) db.commit() sendStatus = True logger.debug('Tasks ' + ' '.join(task.rpt for task in tasks)) if sendStatus: logger.debug('Task complete')
def loadValue(self, path, option, category='text'): val = conf.value(path) option = getattr(self, option) if val is None: return 0 if category in ['text', 'plaintext']: option.setText(val) if category == 'bool': val = boolean(val) option.setChecked(val) if category == 'combox': index = option.findText(val, Qt.MatchFixedString) option.setCurrentIndex(index) if category == 'slider': option.setValue(int(val)) if category == 'list': try: items = json.loads(val) option.addItems(items) except (ValueError, TypeError): pass if category == 'mobile': person = db.query(User).filter_by(mobile=val).first() if person: index = option.findText(person.name, Qt.MatchFixedString) option.setCurrentIndex(index)
def latest(self): """查询本地最新的报文 :return: ORM 对象 """ last = db.query(Taf).filter_by(tt=self.tt).order_by( Taf.sent.desc()).first() return last
def remove(self): row = self.table.currentRow() rpt = self.table.item(row, 1).text() item = db.query(Task).filter_by(rpt=rpt).first() db.delete(item) db.commit() self.updateGui()
def updateContractMenu(self): mobile = conf.value('Monitor/SelectedMobile') person = db.query(User).filter_by(mobile=mobile).first() if person: action = getattr(self, 'contract' + str(person.id), None) if action: action.setChecked(True) else: self.contractNo.setChecked(True)
def save(self): """储存远程报文数据""" last = db.query(Metar).filter_by(tt=self.tt).order_by( Metar.created.desc()).first() if last is None or last.rpt != self.message: item = Metar(tt=self.tt, rpt=self.message) db.add(item) db.commit() logger.info('Save {} {}'.format(self.tt, self.message))
def delPerson(self): """删除联系人""" row = self.contractTable.currentRow() name = self.contractTable.item(row, 0).text() person = db.query(User).filter_by(name=name).first() db.delete(person) db.commit() self.updateContract()
def isExist(self): """查询有没有已经入库的报文 :return: ORM 对象 """ expired = datetime.datetime.utcnow() - datetime.timedelta(hours=24) taf = TafParser(self.message) last = db.query(Taf).filter( or_(Taf.rpt == self.message, Taf.rpt == taf.renderer()), Taf.sent > expired).order_by(Taf.sent.desc()).first() return last
def item(self): item = None recent = datetime.datetime.utcnow() - datetime.timedelta(hours=24) if self.tt in ['FC', 'FT']: item = db.query(Taf).filter(Taf.sent > recent, Taf.tt == self.tt).order_by( Taf.sent.desc()).first() if self.tt in ['WS', 'WC', 'WV']: item = db.query(Sigmet).filter(Sigmet.sent > recent).order_by( Sigmet.sent.desc()).first() if self.tt == 'TREND': item = db.query(Trend).filter(Trend.sent > recent).order_by( Trend.sent.desc()).first() if item and item.isNosig(): item = None return item
def setText(self): last = db.query(Sigmet).filter(Sigmet.tt == self.type.tt, ~Sigmet.rpt.contains('CNL')).order_by(Sigmet.sent.desc()).first() if last: fir = conf.value('Message/FIR') _, text = last.rpt.split('\n') text = text.replace(fir, '') text = text.replace('=', '').strip() self.content.text.setText(text) else: self.content.text.clear()
def amendNumber(self, sort): expired = datetime.datetime.utcnow() - datetime.timedelta(hours=24) query = db.query(Taf).filter(Taf.rpt.contains(self.amdPeriod), Taf.sent > expired) if sort == 'COR': items = query.filter(Taf.rpt.contains('COR')).all() order = chr(ord('A') + len(items)) return 'CC' + order elif sort == 'AMD': items = query.filter(Taf.rpt.contains('AMD')).all() order = chr(ord('A') + len(items)) return 'AA' + order
def updateResendButton(self, item): if not item: return text = item.text() self.resendButton.hide() if text.startswith('TAF'): expired = datetime.datetime.utcnow() - datetime.timedelta(hours=6) taf = Parser(text) self.selected = db.query(Taf).filter(or_(Taf.rpt == text, Taf.rpt == taf.renderer()), Taf.sent > expired).order_by(Taf.sent.desc()).first() if self.selected and not self.selected.confirmed: self.resendButton.show()
def local(self, period=None): """返回本地数据当前时次的最新报文,忽略 AMD COR 报文 :param period: 报文的有效时段 :return: ORM 对象 """ period = self.warningPeriod() if period is None else period expired = datetime.datetime.utcnow() - datetime.timedelta(hours=24) recent = db.query(Taf).filter( Taf.rpt.contains(period), ~Taf.rpt.contains('AMD'), ~Taf.rpt.contains('COR'), Taf.sent > expired).order_by(Taf.sent.desc()).first() return recent
def changeContract(self): target = self.contractsActionGroup.checkedAction() if self.contractNo == target: conf.setValue('Monitor/SelectedMobile', '') logger.info('关闭电话提醒') else: name = target.text() person = db.query(User).filter_by(name=name).first() mobile = person.mobile if person else '' conf.setValue('Monitor/SelectedMobile', mobile) logger.info('切换联系人 %s %s' % (name, mobile))
def updateContract(self): """更新联系人列表""" items = db.query(User).all() self.contractTable.setRowCount(len(items)) for row, item in enumerate(items): self.contractTable.setItem(row, 0, QTableWidgetItem(item.name)) self.contractTable.setItem(row, 1, QTableWidgetItem(item.mobile)) self.selectedContract.clear() options = [item.name for item in items] options.insert(0, QCoreApplication.translate('MainWindow', 'None')) self.selectedContract.addItems(options)
def queryset(self): if hasattr(self.model, 'sent'): dateField = self.model.sent else: dateField = self.model.created query = db.query(self.model).order_by(dateField.desc()) if self.date: delta = datetime.timedelta(days=1) query = query.filter(and_(dateField >= self.date, dateField < self.date + delta)) return query
def setPrev(self): expired = datetime.datetime.utcnow() - datetime.timedelta(hours=self.head.duration) last = db.query(Sigmet).filter(Sigmet.sent > expired, Sigmet.tt == self.type.tt).order_by(Sigmet.sent.desc()).first() if last: validPattern = re.compile(r'(\d{6})/(\d{6})') sequencePattern = re.compile(r'\b(\d)\b') beginningTime, endingTime = validPattern.search(last.rpt).groups() sequence = sequencePattern.search(last.rpt).group() self.content.beginningTime.setText(beginningTime) self.content.endingTime.setText(endingTime) self.content.sequence.setText(sequence)
def setContractMenu(self): self.contractsActionGroup = QActionGroup(self) self.contractsActionGroup.addAction(self.contractNo) contacts = db.query(User).all() for person in contacts: setattr(self, 'contract' + str(person.id), QAction(self)) target = getattr(self, 'contract' + str(person.id)) target.setText(person.name) target.setCheckable(True) self.contractsActionGroup.addAction(target) self.contractsMenu.addAction(target) self.updateContractMenu()
def updateGui(self): items = db.query(Task).filter(Task.taf_id == None).order_by( Task.planning.desc()).all() self.table.setRowCount(len(items)) self.table.resizeRowsToContents() for row, item in enumerate(items): self.table.setItem(row, 0, QTableWidgetItem(item.tt)) self.table.setItem(row, 1, QTableWidgetItem(item.rpt)) self.table.setItem( row, 2, QTableWidgetItem(item.planning.strftime("%m-%d %H:%M:%S"))) self.table.setItem( row, 3, QTableWidgetItem(item.created.strftime("%m-%d %H:%M:%S"))) self.table.resizeRowsToContents()
def setSquence(self): time = datetime.datetime.utcnow() begin = datetime.datetime(time.year, time.month, time.day) count = db.query(Sigmet).filter(Sigmet.sent > begin).count() + 1 self.sequence.setText(str(count))