コード例 #1
0
ファイル: form_manager.py プロジェクト: IGNF/saisie_carhab
class FormManager(QObject):
    
#    Signals:
    
    submitted = pyqtSignal(bool, str, object)
    
    
#    Slots:
    
    def _block_change(self, selected, deselected, clearAndSelect):
        close_form_required_lyr_msg()
        cur_lyr = iface.mapCanvas().currentLayer()
        cur_lyr.selectionChanged.disconnect(self._block_change)
        cur_lyr.setSelectedFeatures([self.cur_feat.id()])
        cur_lyr.selectionChanged.connect(self._block_change)
    
    def _on_record_submitted(self, upd, table_name, obj):
        if table_name == 'sigmaf':
            self.rel_sf.upd_item(obj) if upd else self.rel_sf.add_item(obj)
        elif table_name == 'composyntaxon':
            self.rel_syn.upd_item(obj) if upd else self.rel_syn.add_item(obj)
        
    def _get_syntax(self, idx):
        if not idx == -1:
            for item in self.sf_form.relation.get_items():
                self.del_record('composyntaxon', item)
            self.sf_form.relation.init_table()
            code = self.sf_form.ui.findChild(QComboBox, 'code_sigma').itemData(idx)
            if code:
                syntax_list = CatalogReader('sigmaf').get_syntaxons_from_sf(code)
                for syntax in syntax_list:
                    uvc = iface.mapCanvas().currentLayer().selectedFeatures()[0]['uvc']
                    syntax['uvc'] = uvc
                    cur_sf = self.sf_form.feat_id
                    if cur_sf:
                        syntax['sigmaf'] = cur_sf
                    else:
                        s = QSettings()
                        syntax['sigmaf'] = s.value('current_info/sigmaf')
                    self.submit('composyntaxon', syntax, None)
        
#    Constructor:
    
    def __init__(self):
        QObject.__init__(self)
        self.cur_feat = None
        self.uvc_form = None
        self.sf_form = None
        self.syntax_form = None
        self.rel_sf = None
        self.rel_syn = None
    
    
#    Private methods:

    def _get_selected_feature(self):
        cur_lyr = iface.mapCanvas().currentLayer()
        if not cur_lyr:
            return 0
        features = cur_lyr.selectedFeatures()
        feat = features[0] if len(features) == 1 else 1
        return feat

    def _check_state(self):
        if self.uvc_form and self.uvc_form.ui.isVisible():
            return False
        cur_carhab_lyr = CarhabLayerRegistry.instance().getCurrentCarhabLayer()
        if not cur_carhab_lyr:
            no_carhab_lyr_msg()
            return False
        if self._get_selected_feature() == 0:
            no_vector_lyr_msg()
            return False
        if self._get_selected_feature() == 1:
            one_only_selected_feat_msg()
            return False
        return True
    
    def _exit_fill_form(self):
        cur_lyr = iface.mapCanvas().currentLayer()
        try:
            cur_lyr.selectionChanged.disconnect(self._block_change)
        except:
            pass
        try:
            self.submitted.disconnect(self._on_record_submitted)
        except:
            pass
        
    def _open_form(self, tbl_name, form):
        if form.relation:
            r = self.get_recorder(form.relation.child_table)
            child_items = r.select(tbl_name, form.feat_id)
            form.relation.fill_table(child_items)
        db_obj = self.get_record(tbl_name, form.feat_id)
        form.fill_form(db_obj)
        form.open()
    
    
#    Public methods:
    
    def run(self):
        try:
            self.submitted.disconnect(self._on_record_submitted)
        except:
            pass
        if self._check_state():
            self.db = self.get_db()
            self.create_savepoint()
            self.submitted.connect(self._on_record_submitted)
            
            cur_lyr = iface.mapCanvas().currentLayer()
            cur_lyr.selectionChanged.connect(self._block_change)
            self.cur_feat = self._get_selected_feature()
            uvc_id = self.cur_feat['uvc']
            disp_fields = [
                'code_serie',
                'lb_serie',
                'typ_facies',
                'pct_recouv'
            ]
            self.rel_sf = RelationsManager('sigmaf', disp_fields)
            self.rel_sf.add_clicked.connect(self.open_sf)
            self.rel_sf.edit_clicked.connect(self.open_sf)
            self.rel_sf.del_clicked.connect(self.del_record)
            
            pos = Qt.RightDockWidgetArea
            self.uvc_form = Form('form_uvc', uvc_id, self.rel_sf, pos)
            
            cur_geom_typ = self.cur_feat.geometry().type()
            surface_field = self.uvc_form.ui.findChild(QWidget, 'surface')
            larg_lin_field = self.uvc_form.ui.findChild(QWidget, 'larg_lin')
            larg_lin_field.setEnabled(cur_geom_typ == 1)
            surface_field.setReadOnly(not cur_geom_typ == 0)
            
            self.uvc_form.valid_clicked.connect(self.submit_uvc)
            self.uvc_form.canceled.connect(self.cancel_uvc_fill)
            self.uvc_form.closed.connect(self._exit_fill_form)
            self._open_form('uvc', self.uvc_form)
    
    def open_sf(self, table_name, id=None):
        self.create_savepoint('sigmaf')
        s = QSettings()
        s.setValue('current_info/sigmaf', id)
        disp_fields = [
            'cd_syntax',
            'lb_syntax',
            'abon_domin'
        ]
        self.rel_syn = RelationsManager('composyntaxon', disp_fields)
        self.rel_syn.add_clicked.connect(self.open_syntaxon)
        self.rel_syn.edit_clicked.connect(self.open_syntaxon)
        self.rel_syn.del_clicked.connect(self.del_record)
        
        from_cat = False
        r = self.get_recorder('sigmaf')
        if id:
            from_cat = r.select('id', id)[0].get('catalog')
        else:
            last_sf_id = r.get_last_id() if r.get_last_id() else 0
            s.setValue('current_info/sigmaf', last_sf_id + 1)
            from_cat = question('Appel aux catalogues ?,',\
                'Sélectionner un sigma facies issu des catalogues ?')
            s.setValue('current_info/sigmaf/catalog', int(from_cat))
        
        if not s.value('catalogs'):
            popup('Les référentiels ne sont pas renseignés')
            Catalog().run()
            return
        
        form_name = 'form_sigmaf_cat' if from_cat else 'form_sigmaf'
        self.sf_form = Form(form_name, id, self.rel_syn)
        self.sf_form.canceled.connect(self.cancel_sf_fill)
        self.sf_form.valid_clicked.connect(self.submit_sf)
        self._open_form('sigmaf', self.sf_form)
        
        cd_sf_field = self.sf_form.ui.findChild(QComboBox, 'code_sigma')
        if cd_sf_field:
            cd_sf_field.currentIndexChanged.connect(self._get_syntax)
        
    def open_syntaxon(self, table_name, id=None):
        self.syntax_form = Form('form_syntaxon', id)
        self.syntax_form.canceled.connect(self.cancel_syntaxon_fill)
        self.syntax_form.valid_clicked.connect(self.submit_syntax)
        self._open_form('composyntaxon', self.syntax_form)
    
    def submit_sf(self, table_name, form_obj, id):
        self.submit(table_name, form_obj, id)
        self.sf_form.close()
    
    def submit_syntax(self, table_name, form_obj, id):
        self.submit(table_name, form_obj, id)
        self.syntax_form.close()
    
    def cancel_uvc_fill(self):
        if self.uvc_form.upd_flag:
            if not warning_input_lost_msg():
                return
        self.rollback()
        self.close_db()
        self.uvc_form.close()
            

    def cancel_sf_fill(self):
        self.rollback('sigmaf')
        self.sf_form.close()
        
    def cancel_syntaxon_fill(self):
        self.syntax_form.close()
            
#    Db methods :
    
    def get_db(self):
        cur_carhab_lyr = CarhabLayerRegistry.instance().getCurrentCarhabLayer()
        db = DbManager(cur_carhab_lyr.dbPath)
        return db
    
    def close_db(self):
        self.db.close()
    
    def create_savepoint(self, savepoint=None):
        req = 'SAVEPOINT ' + savepoint if savepoint else 'BEGIN'
        self.db.execute(req)
    
    def rollback(self, savepoint=None):
        req = 'ROLLBACK TO SAVEPOINT ' + savepoint if savepoint else 'ROLLBACK'
        self.db.execute(req)
    
    def get_recorder(self, tbl):
        db = self.db
        r = Recorder(db, tbl)
        return r
    
    def get_record(self, tbl, id):
        r = self.get_recorder(tbl)
        db_obj = {}
        for row in r.select('id', id):
            db_obj = row
        return db_obj
    
    def del_record(self, table_name, id):
        db = self.db
        r = Recorder(db, table_name)
        r.delete_row(id)
    
    def submit(self, table_name, form_obj, id):
        db = self.db
        r = Recorder(db, table_name)
        updated = True
        if id:
            result_msg = r.update(id, form_obj)
            form_obj['id'] = id
        else:
            result_msg = r.input(form_obj)
            updated = False
            form_obj['id'] = r.get_last_id()
        self.submitted.emit(updated, table_name, form_obj)
        return result_msg
        
    def submit_uvc(self, table_name, form_obj, id):
        result_msg = self.submit(table_name, form_obj, id)
        if not result_msg == 1:
            popup(str(result_msg))
            
            return
        self.db.commit()
        iface.mapCanvas().currentLayer().triggerRepaint()
        self.close_db()
        self.uvc_form.close()
        
コード例 #2
0
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.sports = []
        self.ui.add_btn.clicked.connect(self._newForm)

        self.ui.item1 = QtWidgets.QListWidgetItem("Events")
        self.ui.main_list.addItem(self.ui.item1)
        self.ui.item2 = QtWidgets.QListWidgetItem("Results")
        self.ui.main_list.addItem(self.ui.item2)
        self.ui.main_list.itemClicked.connect(self._mainClicked)

        self.manager = QtNetwork.QNetworkAccessManager()
        self.sport_req = QtNetwork.QNetworkRequest(QtCore.QUrl("API URL"))
        self.sport_reply = self.manager.get(self.sport_req)
        self.sport_reply.finished.connect(self._sportsReply)

        self.ui.sport_combo.activated.connect(self._mainReq)
        self.ui.subClass_list.itemClicked.connect(self._loadForm)
        self.sport_dic = {}
        self.loaded = []
        self.resizeTimer = QtCore.QTimer()
        self.resizeTimer.setSingleShot(True)
        self.resizeTimer.timeout.connect(self.tryResize)

    def _mainReq(self):
        self.ui.subClass_list.clear()
        self.ui.add_btn.setEnabled(True)
        self.selected_sport = self.sport_dic.get(
            self.ui.sport_combo.currentText())
        selected = self.ui.main_list.currentItem()
        if selected.text() == "Events":
            dic = {"offset": 0, "limit": 100, "sport_id": self.selected_sport}
            vari_req = QtCore.QJsonDocument.fromVariant(dic)
            json_req = QtCore.QJsonDocument.toJson(vari_req)

            req = QtNetwork.QNetworkRequest(QtCore.QUrl("API URL"))
            req.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader,
                          "application/json")
            self.event_reply = self.manager.post(req, json_req)
            self.event_reply.finished.connect(self._eventsReply)

        if selected.text() == "Results":
            pass

    def _loadForm(self, item):
        i = self.ui.subClass_list.currentRow()
        self.form = Form()
        self.ui.formWidgetLayout.addWidget(self.form)
        self.form.formClosed.connect(self._closeForm)

        title = self.events["message"][i]["title"]
        self.loaded.append(title)
        self.form.form.title_edit_3.setText(title)

        dateTime = str(self.events["message"][i]["event_time"])[0:19]
        date = QtCore.QDateTime.fromString(dateTime, "yyyy-MM-ddTHH:mm:ss")
        self.form.form.dateTime_edit_3.setDateTime(date)
        self.loaded.append(dateTime)  ####fix this after Ali comes!

        description = self.events["message"][i]["description"]
        self.form.form.description_edit_5.append(description)
        self.loaded.append(description)

        self.event_id = self.events["message"][i]["id"]

        league = self.events["message"][i]["league"]["name"]
        self.form.form.lig_combo_5.addItem(league)
        self.loaded.append(league)
        self.leaguesReq(self.selected_sport)

        location = self.events["message"][i]["location"][
            "address"] + " " + self.events["message"][i]["location"][
                "name"] + " " + self.events["message"][i]["location"]["city"]
        self.form.form.location_combo_3.addItem(location)
        self.loaded.append(location)
        teams = []
        for j in range(len(self.events["message"][i]["teams"])):
            self.form.team.addTeam(
                self.events["message"][i]["teams"][j]["name"])
            teams.append(self.events["message"][i]["teams"][j]["name"])
        self.loaded.append(teams)

    def _eventsReply(self):
        reply_file = self.event_reply.readAll()
        json_file = QtCore.QJsonDocument.fromJson(reply_file)
        self.events = json_file.toVariant()
        # print(self.events)

        for i in range(len(self.events["message"])):
            self.ui.subClass_list.addItem(
                str(self.events["message"][i]["title"]))

    def leaguesReq(self, sport_id):

        dic = {"sports": [{"id": sport_id}]}
        vari_req = QtCore.QJsonDocument.fromVariant(dic)
        json_req = QtCore.QJsonDocument.toJson(vari_req)

        req = QtNetwork.QNetworkRequest(QtCore.QUrl("API URL"))
        req.setHeader(QtNetwork.QNetworkRequest.ContentTypeHeader,
                      "application/json")
        self.league_reply = self.manager.post(req, json_req)
        self.league_reply.finished.connect(self._leaguesReply)

    def _leaguesReply(self):
        reply_file = self.league_reply.readAll()
        json_file = QtCore.QJsonDocument.fromJson(reply_file)
        v = json_file.toVariant()
        for i in range(len(v["message"])):
            self.form.form.lig_combo_5.addItem(v["message"][i]["name"])

    def _sportsReply(self):
        reply_file = self.sport_reply.readAll()
        json_file = QtCore.QJsonDocument.fromJson(reply_file)
        v = json_file.toVariant(
        )  #changing variant of c++ to normal python variable that can be anything
        for i in range(len(v["message"])):
            self.sport_dic.update(
                {v["message"][i]["name"]: v["message"][i]["id"]})
            self.ui.sport_combo.addItem(v["message"][i]["name"])

    def _mainClicked(self):
        try:
            self.form.cancel()
        except AttributeError:
            self.ui.sport_combo.setEnabled(True)

    def _newForm(self):
        self.ui.add_btn.setDisabled(True)
        self.ui.sport_combo.setDisabled(True)
        self.leaguesReq(self.selected_sport)
        self.form = Form()
        self.ui.formWidgetLayout.addWidget(self.form)
        self.form.formClosed.connect(self._closeForm)
        self.repaint()

    def _closeForm(self, btn):
        if btn == "save":
            pass
            # self.ui.sizePolicy.setHorizontalStretch(0)
            # self.restoreState(self.state)
        elif btn == "close":
            pass

        self.form.close()
        del (self.form)
        self.ui.add_btn.setEnabled(True)
        self.ui.sport_combo.setEnabled(True)
        self.resizeTimer.start(200)
        self.updateGeometry()
        self.repaint()

    def tryResize(self):
        self.resize(400, 400)