class ui(QWidget): def __init__(self): QWidget.__init__(self) self.setupUI() self.id = 1 self.lines = [] self.editable = True self.des_sort = True self.faker = Factory.create() self.btn_add.clicked.connect(self.add_line) self.btn_del.clicked.connect(self.del_line) self.btn_modify.clicked.connect(self.modify_line) self.btn_select_line.clicked.connect(self.select_line) self.btn_select_single.clicked.connect(self.deny_muti_line) self.btn_sort.clicked.connect(self.sortItem) self.btn_set_header.clicked.connect(self.setheader) self.btn_set_middle.clicked.connect(self.middle) self.table.cellChanged.connect(self.cellchange) self.btn_noframe.clicked.connect(self.noframe) # # Sess = sessionmaker(bind = engine) def setupUI(self): self.setWindowTitle(windowTital) self.resize(640, 480) self.table = QTableWidget(self) self.btn_add = QPushButton(u'增加') self.btn_del = QPushButton(u'删除') self.btn_modify = QPushButton(u'可以编辑') self.btn_select_line = QPushButton(u'选择整行') self.btn_select_single = QPushButton(u'禁止选多行') self.btn_sort = QPushButton(u'以分数排序') self.btn_set_header = QPushButton(u'标头设置') self.btn_set_middle = QPushButton(u'文字居中加颜色') self.btn_noframe = QPushButton(u'取消边框颜色交替') self.spacerItem = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Expanding) self.vbox = QVBoxLayout() self.vbox.addWidget(self.btn_add) self.vbox.addWidget(self.btn_del) self.vbox.addWidget(self.btn_modify) self.vbox.addWidget(self.btn_select_line) self.vbox.addWidget(self.btn_select_single) self.vbox.addWidget(self.btn_sort) self.vbox.addWidget(self.btn_set_header) self.vbox.addWidget(self.btn_set_middle) self.vbox.addWidget(self.btn_noframe) self.vbox.addSpacerItem( self.spacerItem) #可以用addItem也可以用addSpacerItem方法添加,没看出哪里不一样 self.txt = QLabel() self.txt.setMinimumHeight(50) self.vbox2 = QVBoxLayout() self.vbox2.addWidget(self.table) self.vbox2.addWidget(self.txt) self.hbox = QHBoxLayout() self.hbox.addLayout(self.vbox2) self.hbox.addLayout(self.vbox) self.setLayout(self.hbox) self.table.setColumnCount(4) ##设置列数 self.headers = [u'id', u'选择', u'姓名', u'成绩', u'住址'] self.table.setHorizontalHeaderLabels(self.headers) self.show() def add_line(self): self.table.cellChanged.disconnect() row = self.table.rowCount() self.table.setRowCount(row + 1) id = str(self.id) ck = QCheckBox() h = QHBoxLayout() h.setAlignment(Qt.AlignCenter) h.addWidget(ck) w = QWidget() w.setLayout(h) name = self.faker.name() score = str(random.randint(50, 99)) add = self.faker.address() self.table.setItem(row, 0, QTableWidgetItem(id)) self.table.setCellWidget(row, 1, w) self.table.setItem(row, 2, QTableWidgetItem(name)) self.table.setItem(row, 3, QTableWidgetItem(score)) self.table.setItem(row, 4, QTableWidgetItem(add)) self.id += 1 self.lines.append([id, ck, name, score, add]) self.settext(u'自动生成随机一行数据!,checkbox设置为居中显示') self.table.cellChanged.connect(self.cellchange) def del_line(self): removeline = [] for line in self.lines: if line[1].isChecked(): row = self.table.rowCount() for x in range(row, 0, -1): if line[0] == self.table.item(x - 1, 0).text(): self.table.removeRow(x - 1) removeline.append(line) for line in removeline: self.lines.remove(line) self.settext(u'删除在左边checkbox中选中的行,使用了一个笨办法取得行号\n,不知道有没有其他可以直接取得行号的方法!') def modify_line(self): if self.editable == True: self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.btn_modify.setText(u'禁止编辑') self.editable = False else: self.table.setEditTriggers(QAbstractItemView.AllEditTriggers) self.btn_modify.setText(u'可以编辑') self.editable = True self.settext(u'设置,是否可以编辑整个表格') def select_line(self): if self.table.selectionBehavior() == 0: self.table.setSelectionBehavior(1) self.btn_select_line.setStyleSheet('background-color:lightblue') else: self.table.setSelectionBehavior(0) self.btn_select_line.setStyleSheet('') self.settext(u'默认时,点击单元格,只可选择一个格,此处设置为可选择整行') def deny_muti_line(self): if self.table.selectionMode() in [2, 3]: self.table.setSelectionMode(QAbstractItemView.SingleSelection) self.btn_select_single.setStyleSheet('background-color:lightblue') else: self.table.setSelectionMode(QAbstractItemView.ExtendedSelection) self.btn_select_single.setStyleSheet('') self.settext(u'点击时会轮换以多行或单行选择,默认是可以同时选择多行') def sortItem(self): if self.des_sort == True: self.table.sortItems(3, Qt.DescendingOrder) self.des_sort = False self.btn_sort.setStyleSheet('background-color:lightblue') self.table.setSortingEnabled(True) # 设置表头可以自动排序 else: self.table.sortItems(3, Qt.AscendingOrder) self.des_sort = True self.btn_sort.setStyleSheet('background-color:lightblue') self.table.setSortingEnabled(False) self.settext(u'点击时会轮换以升序降序排列,但排序时,会使自动列宽失效!') def setheader(self): font = QFont(u'微软雅黑', 12) font.setBold(True) self.table.horizontalHeader().setFont(font) # 设置表头字体 self.table.setColumnWidth(0, 50) self.table.setColumnWidth(1, 50) self.table.setColumnWidth(3, 100) self.table.horizontalHeader().setSectionResizeMode( 2, QHeaderView.Stretch) self.table.horizontalHeader().setStyleSheet( 'QHeaderView::section{background:gray}') self.table.horizontalHeader().setFixedHeight(50) self.table.setColumnHidden(0, True) self.btn_set_header.setStyleSheet('background-color:lightblue') self.settext( u'设置标头字体及字号,隐藏ID列,设置标头除姓名外全部为固定宽度\n,设置姓名列自动扩展宽度,设置标头行高,设置标头背景色') def middle(self): self.btn_set_middle.setStyleSheet('background-color:lightblue') self.table.setStyleSheet('color:green;') row = self.table.rowCount() for x in range(row): for y in range(4): if y != 1: item = self.table.item(x, y) item.setTextAlignment(Qt.AlignCenter) else: pass self.btn_set_middle.setStyleSheet('background-color:lightblue') self.settext(u'将文字居中显示,设置文字颜色') def cellchange(self, row, col): item = self.table.item(row, col) txt = item.text() self.settext(u'第%s行,第%s列 , 数据改变为:%s' % (row, col, txt)) def noframe(self): self.table.setAlternatingRowColors(True) self.table.setFrameStyle(QFrame.NoFrame) self.table.setStyleSheet('color:green;' 'gridline-color:white;' 'border:0px solid gray') self.settext(u'取消表的框线,\n 取消表格内框') def settext(self, txt): font = QFont(u'微软雅黑', 10) self.txt.setFont(font) self.txt.setText(txt)
class ImportMovementPanel(PanelWithTable): columnList = ReportMovementPanel.columnList def __init__(self): super(self.__class__, self).__init__() self.layout = QtGui.QGridLayout(self) self.importMovementFilter = ImportMovementFilter(self) self.layout.addWidget(self.importMovementFilter, 1, 0, QtCore.Qt.AlignTop) self.layout.addWidget(self.createTable(), 1, 1, QtCore.Qt.AlignTop) self.btnImport = QPushButton("Import", self) self.btnImport.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.layout.addWidget(self.btnImport) self.btnDelete = QPushButton("Delete", self) self.btnDelete.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.layout.addWidget(self.btnDelete) self.initListener() def initListener(self): self.btnImport.clicked.connect(self.doImport) self.btnDelete.clicked.connect(self.doDelete) def createTable(self): self.table = QTableWidget() self.table.setRowCount(1000) self.table.setColumnCount(len(self.columnList) + 1) self.table.setColumnHidden( Constant.CONST_COLUMN_IMPORT_MOVEMENT_HIDDEN_ID, True) self.table.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) self.table.setHorizontalHeaderLabels(self.columnList) #self.pnLTableWidget.resizeColumnsToContents() self.table.sortItems(Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_DATE) self.table.doubleClicked.connect(self.doImportOrDelete) self.table.resizeRowsToContents() self.table.setFixedSize(1100, 900) return self.table def doSubmit(self, filePath, assetName): self.imLO = MovementImporter().getMovementList(filePath, assetName) self.table.setSortingEnabled(False) self.table.clearContents() if (self.imLO.movementList is not None): countRowTable = len(self.imLO.movementList) self.table.setRowCount(countRowTable) self.renderTableForObject(self.imLO.movementList) imLO2 = Engine.getReportMovementList(self.imLO.fromDate, self.imLO.toDate, 'ALL', assetName, self.imLO.custodyName) countRowTable += len(imLO2.movementList) self.table.setRowCount(countRowTable) self.renderTableForRS(imLO2.movementList) self.table.setSortingEnabled(True) self.table.resizeRowsToContents() def renderTableForObject(self, tableList): self.row = 0 isBold = False color = QtGui.QColor(204, 255, 153) for movement in tableList: self.addItemtoTable2( self.table, movement.OID, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_ID, isBold, color) self.addItemtoTable2( self.table, movement.externalID, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EXTERNAL_ID, isBold, color) self.addItemtoTable2(self.table, movement.comment, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_COMMENT, isBold, color) self.addItemtoTable2( self.table, movement.custody.name, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_CUSTODY_NAME, isBold, color) self.addItemtoTable2( self.table, movement.getMovementType(), self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_TYPE, isBold, color) self.addItemtoTable2( self.table, movement.getMovementSubType(), self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_SUB_TYPE, isBold, color) if (movement.asset is not None): self.addItemtoTable2( self.table, movement.asset.name, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_ASSET_NAME, isBold, color) if (movement.tax is not None): self.addItemtoTable2( self.table, "NEW", self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_TAX_ID, isBold, color) self.addItemtoTable2( self.table, movement.tax.taxAmount, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_TAX_AMOUNT, isBold, color) if (isinstance(movement, Movement)): self.addItemtoTable2( self.table, movement.buySell, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_DIRECTION, isBold, color) self.addItemtoTable2( self.table, movement.acquisitionDate, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_DATE, isBold, color) self.addItemtoTable2( self.table, movement.quantity, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_QUANTITY, isBold, color) self.addItemtoTable2( self.table, movement.price, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_PRICE, isBold, color) self.addItemtoTable2( self.table, movement.rate, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_RATE, isBold, color) self.addItemtoTable2( self.table, movement.grossAmount, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_GROSS_AMOUNT, isBold, color) self.addItemtoTable2( self.table, movement.netAmount, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_NET_AMOUNT, isBold, color) self.addItemtoTable2( self.table, movement.commissionPercentage, self.row, Constant. CONST_COLUMN_IMPORT_MOVEMENT_COMMISSION_PERCENTAGE, isBold, color) self.addItemtoTable2( self.table, movement.commissionAmount, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_COMMISSION_AMOUNT, isBold, color) self.addItemtoTable2( self.table, movement.commissionVATAmount, self.row, Constant. CONST_COLUMN_IMPORT_MOVEMENT_COMMISSION_IVA_AMOUNT, isBold, color) self.addItemtoTable2( self.table, movement.tenor, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_TENOR, isBold, color) self.addItemtoTable2( self.table, movement.maturityDate, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_MATURITY_DATE, isBold, color) elif (isinstance(movement, CorporateEvent)): self.addItemtoTable2( self.table, movement.paymentDate, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_DATE, isBold, color) self.addItemtoTable2( self.table, movement.grossAmount, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_GROSS_AMOUNT, isBold, color) self.addItemtoTable2( self.table, movement.netAmount, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_NET_AMOUNT, isBold, color) elif (isinstance(movement, CashMovement)): self.addItemtoTable2( self.table, movement.inOut, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_DIRECTION, isBold, color) self.addItemtoTable2( self.table, movement.movementDate, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_DATE, isBold, color) self.addItemtoTable2( self.table, movement.amount, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_GROSS_AMOUNT, isBold, color) self.addItemtoTable2( self.table, movement.amount, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_NET_AMOUNT, isBold, color) #HiddenID self.addItemtoTable2( self.table, self.row, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_HIDDEN_ID, isBold) self.row += 1 def renderTableForRS(self, tableList): isBold = False for listItem in tableList: self.addItemtoTable(self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_ID, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_TYPE, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_SUB_TYPE, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_DIRECTION, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_ASSET_NAME, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_DATE, isBold) self.addItemtoTable(self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_QUANTITY, isBold) self.addItemtoTable(self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_PRICE, isBold) self.addItemtoTable(self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_RATE, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_GROSS_AMOUNT, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_NET_AMOUNT, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_COMMISSION_PERCENTAGE, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_COMMISSION_AMOUNT, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_COMMISSION_IVA_AMOUNT, isBold) self.addItemtoTable(self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_TENOR, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_MATURITY_DATE, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_CUSTODY_NAME, isBold) self.addItemtoTable(self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_TAX_ID, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_TAX_AMOUNT, isBold) self.addItemtoTable(self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_COMMENT, isBold) self.addItemtoTable( self.table, listItem, self.row, Constant.CONST_COLUMN_IMPORT_MOVEMENT_EXTERNAL_ID, isBold) self.row += 1 def doImportOrDelete(self): index = self.getCurrentRowValue( Constant.CONST_COLUMN_IMPORT_MOVEMENT_HIDDEN_ID) if (index is not None): self.doImport() else: self.doDelete() def doImport(self): index = self.getCurrentRowValue( Constant.CONST_COLUMN_IMPORT_MOVEMENT_HIDDEN_ID) if (index is not None): operation = self.imLO.movementList[int(index)] print(operation.externalID) newID = None taxNewID = None if (isinstance(operation, Movement)): rs = DaoMovement.getMovementsByExternalID(operation.externalID) if len(rs) == 0: if (operation.OID == "NEW"): newID = DaoMovement.insertMovement(operation) if (operation.tax is not None and operation.tax.OID == "NEW"): rs = DaoTax.getTaxByExternalID(operation.tax.externalID) if len(rs) == 0: taxNewID = DaoTax.insert(operation.tax) elif (isinstance(operation, CorporateEvent)): rs = DaoCorporateEvent.getCorporateEventByExternalID( operation.externalID) if len(rs) == 0: newID = DaoCorporateEvent.insert(operation) print(newID) if (operation.tax is not None): rs = DaoTax.getTaxByExternalID( operation.tax.externalID) if len(rs) == 0: operation.tax.originOID = newID taxNewID = DaoTax.insert(operation.tax) elif (isinstance(operation, CashMovement)): rs = DaoCashMovement.getCashMovementsByExternalID( operation.externalID) if len(rs) == 0: newID = DaoCashMovement.insert(operation) box = QMessageBox() box.setWindowTitle('ADD') if (newID is None and taxNewID is None): box.setText("CANNOT ADD externalID " + operation.externalID) else: if (newID is not None and taxNewID is not None): box.setText("INSERTED MOVEMENT " + operation.externalID + " NEWID: " + str(newID) + " NEWTAXID: " + str(taxNewID)) elif (newID is not None and taxNewID is None): box.setText("INSERTED MOVEMENT " + operation.externalID + " NEWID: " + str(newID)) else: box.setText("INSERTED TAX " + operation.tax.externalID + " NEWTAXID: " + str(taxNewID)) box.exec_() def doDelete(self): movementOID = self.getCurrentRowValue( Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_ID) movementType = self.getCurrentRowValue( Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_TYPE) movementSubType = self.getCurrentRowValue( Constant.CONST_COLUMN_IMPORT_MOVEMENT_EVENT_SUB_TYPE) taxOID = self.getCurrentRowValue( Constant.CONST_COLUMN_IMPORT_MOVEMENT_TAX_ID) result = 0 if (movementType == Constant.CONST_MOVEMENT_TYPE and movementSubType == Constant.CONST_MOVEMENT_SUB_TYPE): result = DaoMovement.deleteMovement(movementOID) print(result) elif (movementType == Constant.CONST_MOVEMENT_TYPE and movementSubType == Constant.CONST_CASH_MOVEMENT_SUB_TYPE): result = DaoCashMovement.deleteCashMovement(movementOID) print(result) elif (movementType == Constant.CONST_CORP_EVENT_TYPE and movementSubType == Constant.CONST_CORP_EVENT_SUB_TYPE): if (taxOID): taxResult = DaoTax.deleteTax(taxOID) result = DaoCorporateEvent.deleteCorporateEvent(movementOID) print(result) box = QMessageBox() box.setWindowTitle('DELETED') if (result == 0): box.setText("CANNOT DELETE " + movementType + "-" + movementSubType + "-" + movementOID) else: if (taxOID is None or taxOID == ""): box.setText(movementType + "-" + movementSubType + "-" + movementOID + ": " + str(result) + " record(s) deleted") else: box.setText(movementType + "-" + movementSubType + "-" + movementOID + ": " + str(result) + " record(s) deleted and taxID: " + taxOID + " " + str(taxResult) + " record(s) deleted") box.exec_()
class PositionPanel(QtGui.QWidget): positionTableWidget = None summaryTable = None movementFilterWidget = None row = 0 summaryRow = 0 positionColumnList = "Asset Name;Position;Unit Cost;Market Price;Change%;Invested amount;Valuated amount;Tenor;Maturity Date;Gross PNL;Net PNL;Gross%PNL;Net%PNL;Realized Pnl;%Portfolio;WeightedPNL%".split( ";") summaryColumnList = "Custody;Asset type;Invested Amount;Valuated Amount;Net PnL;Net%PNL;Realized Pnl;RPnL + NPnL;%Portfolio;WeightedPNL%".split( ";") def __init__(self): super(self.__class__, self).__init__() self.layout = QtGui.QGridLayout(self) self.movementFilterWidget = MovementFilterWidget() self.layout.addWidget(self.movementFilterWidget, 1, 0) def clearTables(self): self.row = 0 self.summaryRow = 0 self.createTable() self.createSummaryTable() self.createGeneralInfoPanel() def createSummaryTable(self): self.summaryTableWidget = QTableWidget() self.summaryTableWidget.setRowCount(7) self.summaryTableWidget.setColumnCount(len(self.summaryColumnList)) self.summaryTableWidget.setEditTriggers( QtGui.QAbstractItemView.NoEditTriggers) self.summaryTableWidget.setHorizontalHeaderLabels( self.summaryColumnList) #self.summaryTableWidget.setSortingEnabled(True) #self.summaryTableWidget.sortItems(0) self.summaryTableWidget.resizeColumnsToContents() self.summaryTableWidget.resizeRowsToContents() self.summaryTableWidget.setFixedSize(800, 200) self.layout.addWidget(self.summaryTableWidget, 1, 1) def createGeneralInfoPanel(self): self.generalInfoPanel = QWidget() self.generalInfoLayout = QtGui.QGridLayout(self.generalInfoPanel) self.lblUSDMXN = QLabel("USD/MXN") self.lblUSDMXN.font() self.lblUSDMXN.setFont( QtGui.QFont("MS Shell Dlg", 12, QtGui.QFont.Normal)) self.generalInfoLayout.addWidget(self.lblUSDMXN, 1, 1) self.lblUSDMXNValue = QLabel("0") self.lblUSDMXNValue.setFont( QtGui.QFont("MS Shell Dlg", 12, QtGui.QFont.Bold)) self.generalInfoLayout.addWidget(self.lblUSDMXNValue, 1, 2) self.generalInfoPanel.setFixedSize(200, 50) self.layout.addWidget(self.generalInfoPanel, 1, 2) def createTable(self): self.positionTableWidget = QTableWidget() self.positionTableWidget.setRowCount(27) self.positionTableWidget.setColumnCount( len(self.positionColumnList) + 1) self.positionTableWidget.setColumnHidden( Constant.CONST_COLUMN_POSITION_HIDDEN_ID, True) self.positionTableWidget.setEditTriggers( QtGui.QAbstractItemView.NoEditTriggers) self.positionTableWidget.setHorizontalHeaderLabels( self.positionColumnList) #self.positionTableWidget.setSortingEnabled(True) #self.positionTableWidget.sortItems(0) self.positionTableWidget.doubleClicked.connect(self.openMovementView) self.positionTableWidget.resizeColumnsToContents() self.positionTableWidget.resizeRowsToContents() self.layout.addWidget(self.positionTableWidget, 2, 0, 3, 3) def renderGeneralInfoPanel(self, usdMXNvalue): self.lblUSDMXNValue.setText(str(round(usdMXNvalue, 4))) #self.generalInfoLayout.addWidget(self.lblUSDMXNValue, 1, 2) def renderSummary(self, summaryDict): for (key, summaryItem) in sorted(summaryDict.iteritems()): if summaryItem.custodyName is None: isBold = True else: isBold = False #custodyName custodyNameItem = QTableWidgetItemString(summaryItem.custodyName, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_CUSTODY_NAME, custodyNameItem) #assetTypeName assetTypeNameItem = QTableWidgetItemString(summaryItem.assetType, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_ASSET_TYPE_NAME, assetTypeNameItem) #InvestedAmount investedAmountItem = QTableWidgetItemDecimal( summaryItem.investedAmount, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_INVESTED_AMOUNT, investedAmountItem) #valuatedAmount valuatedAmountItem = QTableWidgetItemDecimal( summaryItem.valuatedAmount, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_VALUATED_AMOUNT, valuatedAmountItem) #subTotalNetPnL netPnLItem = QTableWidgetItemDecimal(summaryItem.netPnL, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_NET_PNL, netPnLItem) #netPNLPercentage netPNLPercentageItem = QTableWidgetItemDecimal( summaryItem.getNetPnLPercentage(), isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_NET_PNL_PERCENTAGE, netPNLPercentageItem) #realizedPnl realizedPnlItem = QTableWidgetItemDecimal(summaryItem.realizedPnl, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_REALIZED_PNL, realizedPnlItem) #realizedPnlPlusNetPnL realizedPnlPlusNetPnLItem = QTableWidgetItemDecimal( summaryItem.realizedPnl + summaryItem.netPnL, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_REALIZED_PNL_PLUS_NET_PNL, realizedPnlPlusNetPnLItem) #positionPercentage positionPercentageItem = QTableWidgetItemDecimal( summaryItem.positionPercentage, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_POSITION_PERCENTAGE, positionPercentageItem) #weightedPnL weightedPnLItem = QTableWidgetItemDecimal(summaryItem.weightedPnL, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_WEIGHTED_PNL, weightedPnLItem) self.summaryRow += 1 def renderSubtotal(self, positionDict, assetType, isSIC): accValuatedAmount = Engine.getSubTotalValuatedAmount( positionDict, assetType, isSIC) accInvestedAmount = Engine.getSubTotalInvestedAmount( positionDict, assetType, isSIC) accRealizedPnl = Engine.getAccRealizedPnL(positionDict, assetType, isSIC) accPositionPercentage = Engine.getAccPositionPercentage( positionDict, assetType, isSIC) accGrossPnlPercentage = Engine.getAccGrossPnlPercentage( positionDict, assetType, isSIC) accNetPnlPercentage = Engine.getAccNetPnlPercentage( positionDict, assetType, isSIC) accNetPNL = Engine.getAccNetPNL(positionDict, assetType, isSIC) accWeightedPNL = Engine.getAccWeightedPNL(positionDict, assetType, isSIC) #Invested amount investedAmountItem = QTableWidgetItemDecimal(accInvestedAmount, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_INVESTED_AMOUNT, investedAmountItem) #sub total valuated amount subTotalValuatedAmountItem = QTableWidgetItemDecimal( accValuatedAmount, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_VALUATED_AMOUNT, subTotalValuatedAmountItem) #sub total Gross PNL subTotalGrossPNLItem = QTableWidgetItemDecimalColor( Engine.getSubtotalGrossPNL(positionDict, assetType, isSIC), True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_PNL, subTotalGrossPNLItem) #sub total Net PNL subTotalNetPNLItem = QTableWidgetItemDecimalColor(accNetPNL, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_NET_PNL, subTotalNetPNLItem) #subTotalGrossPnLPercentage subTotalGrossPnLPercentage = QTableWidgetItemDecimalColor( accGrossPnlPercentage, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_PNL_PERCENTAGE, subTotalGrossPnLPercentage) #pnLNetPercentage subTotalNetPnLPercentage = QTableWidgetItemDecimalColor( accNetPnlPercentage, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_NET_PERCENTAGE, subTotalNetPnLPercentage) #realizedPnL realizedPnLItem = QTableWidgetItemDecimalColor(accRealizedPnl, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_REALIZED_PNL, realizedPnLItem) #positionPercentage positionPercentageItem = QTableWidgetItemDecimal( accPositionPercentage, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_POSITION_PERCENTAGE, positionPercentageItem) #weightedPercentageItem weightedPercentageItem = QTableWidgetItemDecimal(accWeightedPNL, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_WEIGHTED_PNL, weightedPercentageItem) #HiddenID hiddenIDItem = QTableWidgetItemDecimal(self.row, False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_HIDDEN_ID, hiddenIDItem) def renderPositions(self, positionDict, assetType, isSIC): positionList = Engine.getPositionByAssetType(positionDict, assetType, isSIC) for position in positionList: print('rendering ' + position.getAssetName()) if (position.getTotalQuantity() != 0): position.row = self.row #assetName assetNameItem = QTableWidgetItemString(position.getAssetName(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_ASSET_NAME, assetNameItem) #totalQuantity totalQuantityItem = QTableWidgetItemInt( position.getTotalQuantity(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_QUANTITY, totalQuantityItem) #UnitCostOrRate unitCostItem = QTableWidgetItemDecimal( position.getUnitCostOrRate(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_PPP, unitCostItem) #Market price marketPriceItem = QTableWidgetItemDuoDecimal( position.getMarketPrice(), position.getMarketPriceOrig()) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_MARKET_PRICE, marketPriceItem) #changePercentage changePercentageItem = QTableWidgetItemStringPlusMinus( position.changePercentage, False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_CHANGE_PERCENTAGE, changePercentageItem) #Invested amount investedAmountItem = QTableWidgetItemDecimal( position.getInvestedAmount(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_INVESTED_AMOUNT, investedAmountItem) #Valuated amount valuatedAmountItem = QTableWidgetItemDuoDecimal( position.getValuatedAmount(), position.getValuatedAmountOrig()) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_VALUATED_AMOUNT, valuatedAmountItem) #Tenor tenorItem = QTableWidgetItemDuoInt(position.tenor, position.getElapsedDays()) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_TENOR, tenorItem) #Maturity Date maturityDateItem = QTableWidgetItemString( position.getMaturityDate(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_MATURITY_DATE, maturityDateItem) #GrossPnL grossPnlItem = QTableWidgetItemDecimalColor( position.getGrossPnL(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_PNL, grossPnlItem) #netPnL netPnlItem = QTableWidgetItemDecimalColor( position.getNetPnL(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_NET_PNL, netPnlItem) #pnLGrossPercentage pnLGrossPercentageItem = QTableWidgetItemDecimalColor( position.getGrossPnLPercentage(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_PNL_PERCENTAGE, pnLGrossPercentageItem) #pnLNetPercentage pnLNetPercentageItem = QTableWidgetItemDecimalColor( position.getNetPnLPercentage(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_NET_PERCENTAGE, pnLNetPercentageItem) #realizedPnL realizedPnLItem = QTableWidgetItemDecimalColor( position.getConsolidatedRealizedPnl(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_REALIZED_PNL, realizedPnLItem) #positionPercentage positionPercentageItem = QTableWidgetItemDecimal( position.getPositionPercentage(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_POSITION_PERCENTAGE, positionPercentageItem) #weightedPercentageItem weightedPercentageItem = QTableWidgetItemDecimal( position.getWeightedPnl(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_WEIGHTED_PNL, weightedPercentageItem) #HiddenID hiddenIDItem = QTableWidgetItemDecimal(self.row, False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_HIDDEN_ID, hiddenIDItem) self.row += 1 self.renderSubtotal(positionDict, assetType, isSIC) self.row += 1 def openMovementView(self): assetName = self.positionTableWidget.item( self.positionTableWidget.currentRow(), Constant.CONST_COLUMN_POSITION_ASSET_NAME).text() movementList = Engine.getMovementListByAsset( assetName, (self.movementFilterWidget.dateFromDate.date() ).toString("yyyy-M-dd"), (self.movementFilterWidget.dateToDate.date() ).toString("yyyy-M-dd")) self.movementView = MovementView(movementList) self.movementView.show()