Ejemplo n.º 1
0
 def fetchMore(self, index):
     headers = {'Authorization': 'Token ' + Options.get().token}
     try:
         if not self._next:
             url = 'http://' + Options.get(
             ).server_url + '/api/applications/?'
             if self._search_date:
                 url += 'contract_date=' + self._search_date.toString(
                     'yyyy-MM-dd') + '&'
             if self._search_number:
                 url += 'contract_number=' + self._search_number + '&'
             data = requests.get(url, headers=headers).json()
         else:
             data = requests.get(self._next).json()
     except requests.exceptions.ConnectionError:
         QMessageBox().warning(
             None, 'Ошибка',
             'Соединение с сервером потеряно. Программа будет закрыта.')
         die()
         return
     self.beginInsertRows(QModelIndex(), len(self._items),
                          len(self._items) + len(data['results']) - 1)
     for item in data['results']:
         self._items.append(Application.fromDict(item))
     self.endInsertRows()
     self._next = data['next']
     self._has_next_page = bool(data['next'])
Ejemplo n.º 2
0
 def autonomy_mode(self):
     Options.get().autonomy_mode = True
     Models.get().application_types.setItems(
         Options.get().cache_application_types)
     Models.get().clients.setItems(Options.get().cache_clients)
     Models.get().specialists.setItems(Options.get().cache_specialists)
     self.accept()
Ejemplo n.º 3
0
    def process(self):
        try:
            self.progress.emit('Проверка имени пользователя и пароля')
            if not self.checkAuth():
                self.progress.emit(
                    '<font color=red>Неверное имя пользователя и/или пароль</font>'
                )
                self.finished.emit()
                return

            self.progress.emit(
                'Синхронизация локального хранилища с сервером...')
            for client in Options.get().local_clients:
                Models.get().clients.saveItem(client)
            for application in Options.get().local_applications:
                Models.get().applications.saveItem(application)
            Options.get().local_clients = []
            Options.get().local_applications = []

            self.progress.emit('Загрузка типов заявок')
            Models.get().application_types.loadData()
            self.progress.emit('Загрузка заказчиков')
            Models.get().clients.loadData()
            self.progress.emit('Загрузка специалистов')
            Models.get().specialists.loadData()
            self.progress.emit('')
            self.result.emit(True)
        except requests.exceptions.ConnectionError:
            self.result.emit(False)
        self.finished.emit()
Ejemplo n.º 4
0
 def loadData(cls):
     headers = {'Authorization': 'Token ' + Options.get().token}
     data = requests.get('http://' + Options.get().server_url + '/' +
                         cls.url,
                         headers=headers).json()
     cls._items = []
     for item in data:
         cls._items.append(cls.item_class.fromDict(item))
Ejemplo n.º 5
0
 def checkAuth(self):
     data = requests.post('http://' + Options.get().server_url +
                          '/api/auth/',
                          json={
                              'username': self.username,
                              'password': self.password
                          }).json()
     if data['status'] != 'success':
         return False
     Options.get().token = data['token']
     Options.get().group = data['user']['group']
     return True
    def __init__(self,
                 options=None,
                 title='EmdrosApplication',
                 DO_REF=True,
                 DO_OUT=True,
                 DO_LBL=True):
        if options is None:
            options = Options()
        kernel_cfg_name = options.get('kernel')
        if kernel_cfg_name is not None:
            kernel_cfg_name = 'emdros_application.syscfg.' + re.sub(
                '\.py[c]?$', '', kernel_cfg_name)
        else:
            kernel_cfg_name = syscfg.config.DEFAULT_KERNEL
        import importlib
        kernel = importlib.import_module(kernel_cfg_name)
        self.kernel = kernel
        #kernel = __import__(kernel_cfg_name)

        self.title = title
        self.DO_REF = DO_REF
        self.DO_OUT = DO_OUT
        self.DO_LBL = DO_LBL
        self.title = title

        self.spinner = Spinner()

        if options is None:
            self.options = Options(
                addPathAndExt('options', kernel.CFG_DIR, kernel.CFG_EXT))
        else:
            self.options = options

        self.cfg = self.configure(self.options, kernel)
        self.modeCfgs = self.setupModeConfigurations(kernel)

        self.mql = MQLEngine(database=self.database,
                             usr=self.usr,
                             pwd=self.pwd,
                             be=self.backend,
                             domainfile=self.domainqueryfile,
                             domain=self.domain,
                             VERBOSE=self.VERBOSE,
                             verbose=self.verbose,
                             test=self.test,
                             outstream=self.outstream,
                             errstream=self.errstream,
                             kernel=kernel)

        if self.DO_OUT or self.DO_REF:
            self.ref, self.out = self.setupOutput(kernel=kernel)

        if self.DO_LBL:
            self.lbl = self.setupLabelManagers(options.args, kernel=kernel)

        if self.options.get('gui'):
            self.gui = GUI(title=title, app=self)
            self.gui.mainloop()
        else:
            self.gui = None
Ejemplo n.º 7
0
    def login(self):
        Options.get().username = self.ui.edtUsername.text()

        self.ui.btnAutonomyMode.setEnabled(False)
        self.ui.btnLogin.setEnabled(False)

        self.loadModels()
Ejemplo n.º 8
0
 def __init__(self):
     super(ApplicationModel, self).__init__()
     self._items = Options.get().local_applications.copy()
     self._next = None
     self._has_next_page = True
     self._search_date = None
     self._search_number = None
Ejemplo n.º 9
0
 def saveItem(cls, item):
     headers = {'Authorization': 'Token ' + Options.get().token}
     try:
         if item.id is None:
             data = requests.post('http://' + Options.get().server_url +
                                  '/' + cls.url,
                                  json=item.toDict(),
                                  headers=headers).json()
             item.id = data['id']
         else:
             requests.put('http://' + Options.get().server_url + '/' +
                          cls.url + str(item.id) + '/',
                          json=item.toDict(),
                          headers=headers)
         return True
     except requests.exceptions.ConnectionError:
         return False
Ejemplo n.º 10
0
 def search(self, number=None, date=None):
     self._search_date = date
     self._search_number = number
     self.beginResetModel()
     self._next = None
     self._has_next_page = True
     self._items = Options.get().local_applications.copy()
     self.endResetModel()
Ejemplo n.º 11
0
 def setupContract(self):
     has_perms = Options.get().group in ('supervisor', 'accounting')
     if self.currentApplication().contract is not None:
         self.ui.btnEditContract.setEnabled(has_perms)
         self.ui.btnCreateContract.setEnabled(False)
         self.ui.btnPrintContract.setEnabled(True)
         self.ui.lblContractNumber.setText('№%s' % self.currentApplication().contract.number)
     else:
         self.ui.btnEditContract.setEnabled(False)
         self.ui.btnCreateContract.setEnabled(has_perms)
         self.ui.btnPrintContract.setEnabled(False)
         self.ui.lblContractNumber.setText('не создан')
Ejemplo n.º 12
0
 def tblApplicationsSelectionChanged(self, selected, deselected):
     if len(self.ui.tblApplications.selectedIndexes()):
         self.ui.btnEditApplication.setEnabled(not Options.get().autonomy_mode)
         self.ui.pnlDocuments.setEnabled(bool(self.currentApplication().id))
         self.ui.btnPrintApplication.setEnabled(True)
         self.setupContract()
         self.setupAccount()
         self.setupOrder()
         self.setupProtocols()
     else:
         self.ui.btnEditApplication.setEnabled(False)
         self.ui.pnlDocuments.setEnabled(False)
         self.ui.btnPrintApplication.setEnabled(False)
Ejemplo n.º 13
0
 def setupOrder(self):
     has_perms = self.currentApplication().contract is not None and \
                 self.currentApplication().account is not None and \
                 Options.get().group in ('supervisor', 'secretary', 'testing')
     if self.currentApplication().order is not None:
         self.ui.btnEditOrder.setEnabled(has_perms)
         self.ui.btnCreateOrder.setEnabled(False)
         self.ui.btnPrintOrder.setEnabled(True)
         self.ui.lblOrderNumber.setText('№%s' % self.currentApplication().order.number)
     else:
         self.ui.btnEditOrder.setEnabled(False)
         self.ui.btnCreateOrder.setEnabled(has_perms)
         self.ui.btnPrintOrder.setEnabled(False)
         self.ui.lblOrderNumber.setText('не создан')
Ejemplo n.º 14
0
 def edit(cls, client, parent=None):
     from views.client_form import ClientForm
     dlg = ClientForm(parent)
     dlg.setClient(client)
     result = dlg.exec()
     if result == ClientForm.Accepted:
         client = dlg.getClient()
         if not Options.get().autonomy_mode:
             while not cls.model.saveItem(client):
                 p = QMessageBox().warning(
                     parent, 'Ошибка',
                     'Потеряно соединение с сервером. Повторить?\nПри отмене программа будет '
                     'закрыта, а несохраненные изменения потеряны.',
                     QMessageBox.Retry | QMessageBox.Cancel)
                 if p != QMessageBox.Retry:
                     die()
         return True
     return False
Ejemplo n.º 15
0
 def createApplication(self, parent=None):
     dlg = ApplicationWizard(parent)
     result = dlg.exec()
     if result == ApplicationWizard.Accepted:
         application = dlg.getApplication()
         if not Options.get().autonomy_mode:
             while not self.saveItem(application):
                 p = QMessageBox().warning(
                     None, 'Ошибка',
                     'Потеряно соединение с сервером. Повторить?\nПри отмене программа будет '
                     'закрыта, а несохраненные изменения потеряны.',
                     QMessageBox.Retry | QMessageBox.Cancel)
                 if p != QMessageBox.Retry:
                     self.addItem(application)
                     die()
         self.addItem(application)
         return True
     return False
Ejemplo n.º 16
0
 def loadModelsFinished(self, success):
     if not success:
         if Options.get().autonomy_available:
             ans = QMessageBox().warning(
                 None, 'Ошибка',
                 'Произошла ошибка при соединении с сервером. Перейти в автономный режим?',
                 QMessageBox.Yes | QMessageBox.No)
             if ans == QMessageBox.Yes:
                 self.autonomy_mode()
                 return
         else:
             QMessageBox().warning(
                 None, 'Ошибка',
                 'Произошла ошибка при соединении с сервером.',
                 QMessageBox.Ok)
         self.reset()
     else:
         self.accept()
class EmdrosApplication:
    def __init__(self,
                 options=None,
                 title='EmdrosApplication',
                 DO_REF=True,
                 DO_OUT=True,
                 DO_LBL=True):
        if options is None:
            options = Options()
        kernel_cfg_name = options.get('kernel')
        if kernel_cfg_name is not None:
            kernel_cfg_name = 'emdros_application.syscfg.' + re.sub(
                '\.py[c]?$', '', kernel_cfg_name)
        else:
            kernel_cfg_name = syscfg.config.DEFAULT_KERNEL
        import importlib
        kernel = importlib.import_module(kernel_cfg_name)
        self.kernel = kernel
        #kernel = __import__(kernel_cfg_name)

        self.title = title
        self.DO_REF = DO_REF
        self.DO_OUT = DO_OUT
        self.DO_LBL = DO_LBL
        self.title = title

        self.spinner = Spinner()

        if options is None:
            self.options = Options(
                addPathAndExt('options', kernel.CFG_DIR, kernel.CFG_EXT))
        else:
            self.options = options

        self.cfg = self.configure(self.options, kernel)
        self.modeCfgs = self.setupModeConfigurations(kernel)

        self.mql = MQLEngine(database=self.database,
                             usr=self.usr,
                             pwd=self.pwd,
                             be=self.backend,
                             domainfile=self.domainqueryfile,
                             domain=self.domain,
                             VERBOSE=self.VERBOSE,
                             verbose=self.verbose,
                             test=self.test,
                             outstream=self.outstream,
                             errstream=self.errstream,
                             kernel=kernel)

        if self.DO_OUT or self.DO_REF:
            self.ref, self.out = self.setupOutput(kernel=kernel)

        if self.DO_LBL:
            self.lbl = self.setupLabelManagers(options.args, kernel=kernel)

        if self.options.get('gui'):
            self.gui = GUI(title=title, app=self)
            self.gui.mainloop()
        else:
            self.gui = None

    # overload this with something useful
    def next(self):
        if self.gui:
            self.gui.writeln('EmdrosApplication says: "next"')

    # overload this with something useful
    def quit(self):
        exit()

    def configure(self, options, kernel):

        # CFG_FILE is initially defined in the kernel configuration
        # program option -C (--CFG) overrides it

        cfg_name = options.get('CFG')
        #if cfg_name is not None:
        #CFG_FILE = cfg_name
        #else:
        if cfg_name is None:
            cfg_name = kernel.DEFAULT_KERNEL_CFG
        self.cfg = Configuration(cfg_name, kernel=kernel)

        # settings in local_cnf override settings in CONFIG_FILE
        local_cfg = options.get('cfg')
        if local_cfg is not None:
            local_cfg = Configuration(local_cfg, kernel=kernel)
            self.cfg.overrideWith(local_cfg)

        # settings in command line options override settings in
        # CONFIG_FILE and local_cnf

        self.cfg.overrideWith(options.toConfiguration(kernel=kernel))

        ### set global variables

        self.auto = self.cfg.get('auto')
        self.verbose = self.cfg.get('verbose')
        self.VERBOSE = self.cfg.get('VERBOSE')

        backends = {
            'NO_BACKEND': EmdrosPy.kBackendNone,
            'POSTGRES': EmdrosPy.kPostgreSQL,
            'MYSQL': EmdrosPy.kMySQL,
            'SQL2': EmdrosPy.kSQLite2,
            'SQL3': EmdrosPy.kSQLite3
        }

        if self.cfg.get('backend') is not None:
            self.backend = backends[self.cfg.get('backend')]
        else:
            try:
                self.backend = backends[kernel.DEFAULT_BACKEND]
            except:
                exitOnError('no backend defined in configuration files')

        self.database = self.cfg.get('database')
        if self.cfg.get('usr'):
            self.usr = self.cfg.get('usr')
        else:
            self.usr = DEFAULT_USR
        if self.cfg.get('pwd'):
            self.pwd = self.cfg.get('pwd')
        else:
            self.pwd = DEFAULT_PWD

        if self.cfg.has_key('modes'):
            self.modes = self.cfg.get_multi('modes')  # has proper order
        else:
            self.modes = self.options.validVals('mode')
        self.mode = self.cfg.get('mode')

        if self.cfg.has_key('formats'):
            self.formats = self.cfg.get_multi('formats')
        else:
            self.formats = self.options.validVals('format')
            self.cfg.set_multi('formats', self.formats)
        self.format = self.cfg.get('format')
        self.json = self.cfg.get('jsonoverride')

        self.domain = self.cfg.get('domain')
        self.domainqueryfile = self.cfg.get('domainqueryfile')

        self.test = self.cfg.get('test')

        self.outstream = eval(self.cfg.get('stdout'))
        self.errstream = eval(self.cfg.get('stderr'))

        return self.cfg

    def setupModeConfigurations(self, kernel):
        modeCfgs = {}
        for m in self.modes:
            if self.cfg.has_key('modecfg', m):
                cfgname = self.cfg.get('modecfg', m)
                cfg = Configuration(cfgname,
                                    kernel=kernel,
                                    verbose=self.VERBOSE)
                if cfg is not None:
                    self.Vmsg('cfg for %s mode: %s' % (m, cfgname))
                modeCfgs[m] = cfg
            else:
                warning(
                    "no key 'modecfg' defined for mode %s in configuration file"
                    % m)
        return modeCfgs

    def setupLabelManagers(self, opt_otypes, kernel=None):
        self.lblManagers = {}
        for m in self.modes:
            if m == self.mode:
                opt_o = opt_otypes
            else:
                opt_o = []
            try:
                self.lblManagers[m] = LabelManager(mql=self.mql,
                                                   mode=m,
                                                   globalcfg=self.cfg,
                                                   local_cfg=self.modeCfgs[m],
                                                   opt_otypes=opt_o,
                                                   kernel=kernel)
            except:
                exitOnError()
        if self.options.get('sync'):
            if self.options.get('auto'):
                mlist = self.modes
            else:
                mlist = userCheckList(self.modes,
                                      question="toggle modes to update")

            if mlist == []:
                writeln('no labels will be updated', outstream=self.errstream)
            else:
                for m in mlist:
                    self.updateLabels(m)

        return self.lblManagers[self.mode]

    def setupOutput(self, kernel):
        if self.DO_REF:
            ref = ReferenceManager(self.mql, self.cfg, kernel=kernel)
        else:
            ref = None

        if self.DO_OUT:
            out = OutputManager(self.mql,
                                self.cfg,
                                format=self.format,
                                json=self.json,
                                outstream=self.outstream,
                                msgstream=self.errstream,
                                verbose=self.verbose,
                                VERBOSE=self.VERBOSE,
                                kernel=kernel)
            if out is None:
                writeln('output manager based on %s could not be initiated' %
                        self.json)
        else:
            out = None
        return ref, out

    def Vmsg(self, msg):
        if self.VERBOSE:
            writeln(msg, outstream=self.errstream)

    def vmsg(self, msg):
        if self.verbose or self.VERBOSE:
            writeln(msg, outstream=self.errstream)

    def setMode(self, mode):
        if mode not in self.modes:
            raise Exception('wrong value %s in EmdrosApplication.setMode(): %s' % \
              mode, repr(self.modes))
        else:
            self.mode = mode
            self.mql.mode = mode
            if self.DO_OUT and self.out is not None:
                self.out.mode = mode
            if self.DO_LBL and self.lblManagers is not None:
                self.lbl = self.lblManagers[mode]

    def setFormat(self, format):
        if format not in self.formats:
            raise Exception('wrong value %s in EmdrosApplication.setMode(): %s' % \
              format, repr(self.formats))
        else:
            self.format = format
            if self.out is not None:
                self.out.format = format

    def updateLabels(self, mode=None, forced=False, mql=None, objTypes=None):
        if mode is None: mode = self.mode
        if self.lblManagers is None or self.lblManagers[mode] is None:
            warning('no label manager for %s existing' % mode)
        else:
            if mql is None: mql = self.mql
            self.lblManagers[mode].updateAll(forced=forced,
                                             mql=mql,
                                             objTypes=objTypes)

    def write(self, msg='', outstream=None):
        if self.gui:
            self.gui.write(msg, outstream=outstream)
        else:
            write(msg, outstream=outstream)

    def writeln(self, msg='', outstream=None):
        if self.gui:
            self.gui.writeln(msg)
        else:
            writeln(msg, outstream=outstream)

    def userMultiLineInput(self, msg=None):
        if self.gui:
            return self.gui.userMultiLineInput()
        else:
            return userMultiLineInput(msg)
Ejemplo n.º 18
0
 def canFetchMore(self, index):
     return self._has_next_page and not Options.get().autonomy_mode
Ejemplo n.º 19
0
 def setupUi(self):
     self.ui.edtUsername.setText(Options.get().username)
     if not Options.get().autonomy_available:
         self.ui.btnAutonomyMode.setEnabled(False)
Ejemplo n.º 20
0
 def addItem(self, item):
     local = len(Options.get().local_applications)
     self.beginInsertRows(QModelIndex(), local, local)
     self._items.insert(local, item)
     self.endInsertRows()
Ejemplo n.º 21
0
 def selectionChanged(self, index):
     self._result = index.internalPointer().id
     self.ui.buttonBox.button(QDialogButtonBox.Ok).setEnabled(True)
     self.ui.btnEdit.setEnabled(not Options.get().autonomy_mode)