コード例 #1
0
def getCtxId(id, server):
    ctxdir = None
    if id is not None:
        ctxdir = glob.glob('{0}/.kcluster/{1}*'.format(utils.getHome(), id))
    elif id is None and server is None:
        ctxdir = glob.glob('{0}/.kcluster/*'.format(utils.getHome()))
    if ctxdir is not None:
        ctxdir = [c for c in ctxdir if os.path.isdir(c)]  # filter only dirs
        if len(ctxdir) != 1:
            print("ID not unique or not found {0}".format(ctxdir))
            exit()
        else:
            return os.path.basename(ctxdir[0])
    else:
        return None  # id stays None
コード例 #2
0
def apiOperWithLogin(user, servers, id, verb, noun, queryParams, data):
    resp = doAPIOper(servers, id, verb, noun, queryParams, data)
    if resp is not None and resp.status_code == 401 and 'NeedLogin' in resp.json(
    ) and resp.json()['NeedLogin']:
        #print(json.dumps(resp.json()))
        cfg = utils.loadYaml("{0}/.{1}/{1}.users.yaml".format(
            utils.getHome(), "kcluster"))
        oidclogin.login(cfg[user]['provider'].lower(), "kcluster")
        # update token & try again
        cfg = utils.loadYaml("{0}/.{1}/{1}.users.yaml".format(
            utils.getHome(), "kcluster"))
        queryParams['id_token'] = cfg[user]['tokens']['id_token']
        return doAPIOper(servers, id, verb, noun, queryParams, data)
    else:
        return resp
コード例 #3
0
def dumpServers(resp, configLoc):
    cfgdir = utils.getHome()+"/.{0}".format(configLoc)
    print("Writing {0} to {1}".format(resp.json(), cfgdir))
    utils.mkdir(cfgdir)
    with open('{0}/servers.yaml'.format(cfgdir), 'w') as fp:
        yaml.dump(resp.json(), fp)
    return resp.json()["ClusterID"]
コード例 #4
0
def main(argv):
    parser = argparse.ArgumentParser(
        "kubectl.py",
        description=
        "Run kubectl commands on cluster, any arguments not parsed here will be passed directly to kubectl"
    )
    parser.add_argument("--id",
                        default=None,
                        help="Context ID of cluster to operate on")
    parser.add_argument("-u", "--user", default=None)
    parser.add_argument("-n", "--namespace", default=None)
    args, remargs = parser.parse_known_args(argv)

    (args.id, args.user) = getCtx(args.id, args.user, None)

    # move default config as it may conflict, register to remove
    moveExistConfig()

    cfgdir = "{0}/.kcluster/{1}".format(utils.getHome(), args.id)
    serverInfo = utils.loadYaml("{0}/servers.yaml".format(cfgdir))
    servers = serverInfo["Servers"]
    servers = [
        re.sub('(.*):(.*)', '\g<1>:{0}'.format(serverInfo["k8sport"]), s)
        for s in servers
    ]
    (queryParams, _) = argsToQuery(user=args.user)
    webutils.tryServers(
        servers, partial(doOper, args.user, args.id, remargs, args.namespace),
        partial(getServers, queryParams))
コード例 #5
0
def setCtx(id, user):
    if user is not None and id is not None:
        with open('{0}/.kcluster/context.yaml'.format(utils.getHome()),
                  'w') as fp:
            yaml.dump({'ClusterID': id, 'User': user}, fp)
    else:
        print("Unable to determine id or user")
コード例 #6
0
def argsToQuery(user=None,
                workspec=None,
                status=None,
                workcfg=None,
                workfile=None,
                origspec=None,
                workuser=None,
                dataPut=None):
    queryParams = {}
    data = dataPut
    if user is not None:
        home = utils.getHome()
        cfgfile = "{0}/.{1}/{1}.users.yaml".format(home, "kcluster")
        cfg = utils.loadYaml(cfgfile)
        queryParams['provider'] = cfg[user]['provider']
        queryParams['id_token'] = cfg[user]['tokens']['id_token']
    else:  # worktoken
        queryParams['work_token'] = os.environ["KC_WORKTOKEN"]
    if status is not None:
        queryParams['status'] = status
    if workuser is not None:
        queryParams['workuser'] = workuser

    if workspec is not None:
        if data is None:
            data = {}
        data.update({
            'spec': workspec,  # this work's spec - a map
            'origspec': origspec,  # original spec without mods - a map
            'workfile': workfile  # the raw file as string
        })
        if workcfg is not None:
            data['workcfg'] = workcfg  # a map

    return queryParams, data
コード例 #7
0
def moveExistConfig():
    home = utils.getHome()
    if os.path.exists("{0}/.kube/config".format(home)):
        tempname = "{0}/.kube/config_temp_{1}".format(home,
                                                      utils.random_string(16))
        os.rename("{0}/.kube/config".format(home), tempname)
        atexit.register(os.rename, tempname, "{0}/.kube/config".format(home))
コード例 #8
0
def getUser(id, user):
    if user is None:
        cfgfile = "{0}/.{1}/{1}.users.yaml".format(utils.getHome(), "kcluster")
        if not os.path.exists(cfgfile) and id is not None:
            cfgfile = "{0}/.{1}/{2}/users.yaml".format(utils.getHome(),
                                                       "kcluster", id)
        # if id is None:
        #     cfgfile = "{0}/.{1}/{1}.users.yaml".format(utils.getHome(), "kcluster")
        # else:
        #     cfgfile = "{0}/.{1}/{2}/users.yaml".format(utils.getHome(), "kcluster", id)
        cfg = utils.loadYaml(cfgfile)
        if len(list(cfg)) > 1:
            print("User must be specified - one of {0}".format(list(cfg)))
            exit()
        user = list(cfg)[0]
    return user
コード例 #9
0
 def __init__(self, db, sql):
     Home = getHome()
     if os.path.exists(sql):
         cmd_template = Home +  """/sqlite3.exe {0} < {1}"""
         self.cmd = cmd_template.format(db, sql)
     else:
         cmd_template = Home +  """/sqlite3.exe {0} {1}"""
         self.cmd = cmd_template.format(db, sql)
コード例 #10
0
 def __init__(self,parent=None):  
     super(TimeSheetDialog,self).__init__(parent)  
     self.setupUi(self)
     self.dateEdit.setDate(datetime.now())
     self.dateEdit_2.setDate(datetime.now())
     self.connect(self.importSOHOWH_Button,SIGNAL("clicked()"),self.importSOHOWorkHour)
     self.connect(self.importSHFAWH_Button,SIGNAL("clicked()"),self.importSHFAWorkHour)
     self.connect(self.importHoliday_Button,SIGNAL("clicked()"),self.importHoliday)
     self.connect(self.importOuting_Button,SIGNAL("clicked()"),self.importOuting)
     self.connect(self.importOuting2_Button,SIGNAL("clicked()"),self.importOuting2)
     self.connect(self.importOT_Button,SIGNAL("clicked()"),self.importOverTime)
     self.connect(self.calc_Button,SIGNAL("clicked()"),self.calc)
     
     if not os.path.isdir(getHome() + "/db/"):
         os.mkdir(getHome() + "/db/")
         
     self.dbname = getHome() + "/db/" + str(time.time()) + ".db"
コード例 #11
0
 def __init__(self, parent, title, fName=None, html=None):
     wx.Frame.__init__(self, parent, -1, title, size=(600, 400))
     assert (fName is None or html is None)
     self.win = wx.html.HtmlWindow(self, -1)
     if fName is not None:
         fn = os.path.join(getHome(), fName)
         self.win.LoadFile(fn)
     if html is not None:
         self.win.SetPage(html)
コード例 #12
0
def apiOperWork(verb, noun, queryParams=None, data=None):
    home = utils.getHome()
    if queryParams is None:
        (queryParams, _) = argsToQuery()
    id = os.environ["KC_CLUSTERID"]
    if os.path.exists('{0}/.{1}/{2}/servers.yaml'.format(home, "kcluster",
                                                         id)):
        servers = None  # read from file
    else:
        servers = os.environ["KC_APISERVERS"].split(
            ",")  # initial list of servers
    return doAPIOper(servers, id, verb, noun, queryParams, data)
コード例 #13
0
def getKubeStr(user, id, kubeargstr, namespace, server):
    cfgdir = "{0}/.kcluster/{1}".format(utils.getHome(), id)
    base = "{0}/{1}".format(cfgdir, user)
    if namespace is None:
        namespace = utils.loadYaml(
            "{0}/users.yaml".format(cfgdir))[user]['namespace']
    cmd = ("kubectl --server={0} --namespace={1} "
           "--certificate-authority={2}/ca-kube.pem "
           "--client-certificate={3}-kube.pem "
           "--client-key={3}-kube-key.pem {4}".format(server, namespace,
                                                      cfgdir, base,
                                                      kubeargstr))
    #print(cmd)
    return cmd
コード例 #14
0
def serversWithPort(id, port, http=None):
    cfgdir = "{0}/.kcluster/{1}".format(utils.getHome(), id)
    serverInfo = utils.loadYaml("{0}/servers.yaml".format(cfgdir))
    servers = serverInfo["Servers"]
    if http is None:
        return [
            re.sub('(.*):(.*)', '\g<1>:{0}'.format(port), s) for s in servers
        ]
    else:
        return [
            re.sub('(.*)://(.*):(.*)', '{0}://\g<2>:{1}'.format(http, port), s)
            for s in servers
        ]
    return servers
コード例 #15
0
def dumpKubeCreds(user, resp, id):
    cfgdir = utils.getHome() + "/.kcluster/{0}".format(id)
    print("Writing {0} to {1}".format(resp, cfgdir))
    with open('{0}/ca-kube.pem'.format(cfgdir), 'w') as fp:
        fp.write(resp['CA'])
    with open('{0}/{1}-kube.pem'.format(cfgdir, user), 'w') as fp:
        fp.write(resp['Cert'])
    with open('{0}/{1}-kube-key.pem'.format(cfgdir, user), 'w') as fp:
        fp.write(resp['Key'])
    with open('{0}/{1}-kube.config'.format(cfgdir, user), 'w') as fp:
        # create config file
        yaml.safe_dump(createKubeConfig(cfgdir, resp), fp)
    # also merge into kubeconfig
    if ctxName is None:
        cname = getKubeServers(cfgdir)[0].split('//')[1].split('.')[0].split(
            '-infra')[0]
    else:
        cname = ctxName
    uname = cname + '-' + user
    kcfg = createKubeConfig(cfgdir,
                            resp,
                            clustername=cname,
                            username=uname,
                            contextname=uname)
    basecfg = utils.getHome() + '/.kube/config'
    if os.path.exists(basecfg):
        baseYaml = utils.loadYaml(basecfg)
        baseYaml['clusters'] = removeDups(baseYaml['clusters'], cname)
        baseYaml['users'] = removeDups(baseYaml['users'], uname)
        baseYaml['contexts'] = removeDups(baseYaml['contexts'], uname)
        newYaml = utils.deepmerge(kcfg, baseYaml)
        fd, name = tempfile.mkstemp()
        utils.dumpYaml(newYaml, name)
        print("merging configuration into {0}".format(basecfg))
        shutil.copy(name, basecfg)
        os.close(fd)
        os.remove(name)
コード例 #16
0
def doKubeOper(user, id, kubeargs, namespace=None, servers=None):
    moveExistConfig()
    if servers is None:
        cfgdir = "{0}/.kcluster/{1}".format(utils.getHome(), id)
        serverInfo = utils.loadYaml("{0}/servers.yaml".format(cfgdir))
        servers = serverInfo["Servers"]
        servers = [
            re.sub('(.*):(.*)', '\g<1>:{0}'.format(serverInfo["k8sport"]), s)
            for s in servers
        ]
        #print("SERVERS: {0}".format(servers))
    doOperFn = lambda server: doOper(user, id, kubeargs, namespace, server,
                                     True)
    out = webutils.tryServers(servers, doOperFn, None)
    return out.stdout.decode(), out
コード例 #17
0
def getCtx(id, user, server, setcontext=False):
    ctxFile = '{0}/.kcluster/context.yaml'.format(utils.getHome())
    if os.path.exists(ctxFile) and not setcontext:
        ctx = utils.loadYaml(ctxFile)
        if id is None:
            id = ctx['ClusterID']
        else:
            id = getCtxId(id, server)
        if user is None:
            user = ctx['User']
        else:
            user = getUser(id, user)
    else:
        id = getCtxId(id, server)
        user = getUser(id, user)
    return id, user
コード例 #18
0
    def OnInit(self):
        wx.InitAllImageHandlers()

        # Show a splash screen
        png = os.path.join(getHome(), "Icons", "splash.png")
        bmp = wx.Image(png).ConvertToBitmap()
        wx.adv.SplashScreen(
            bmp, wx.adv.SPLASH_CENTRE_ON_SCREEN | wx.adv.SPLASH_TIMEOUT, 5000,
            None, -1)

        self.frame = Frame(None)
        self.frame.Show(True)
        self.frame.Center()
        self.frame.Raise()
        self.SetTopWindow(self.frame)
        return True
コード例 #19
0
def getPlugins(package, baseClass, format, exclude0):
    """Find plugins of a specified type.
  
  Each plugin has a status value that may be 0, 1, or 2.  For status=0, the 
  plugin is excluded by default, but will be included if exclude0 is set to
  False.  For Method plugins, status=1 or 2 indicates whether the method
  appears in the fist tier list or second tier list.  For Loader and Report
  plugins there is only one tier.
  """

    assert (format in ["byName", "classes"])

    # Import all modules in package
    ppath = package.__path__
    pname = package.__name__ + "."
    for importer, modname, ispkg in pkgutil.iter_modules(ppath, pname):
        module = __import__(modname, fromlist="dummy")

    # Look for user-installed plugins
    externalPluginDir = os.path.join(getHome(), "Plugins")
    if os.path.exists(externalPluginDir):
        if externalPluginDir not in sys.path:
            sys.path.append(externalPluginDir)
        externalPlugins = [
            x[:-3] for x in os.listdir(externalPluginDir) if x.endswith(".py")
        ]
        for plugin in externalPlugins:
            __import__(plugin)

    # Get plugin list from subclasses of baseClass
    pluginClasses = []
    for m in baseClass.__subclasses__():
        if exclude0 and m.status == 0:
            del m
        else:
            pluginClasses.append(m)

    if format == "classes":
        return pluginClasses
    elif format == "byName":
        pluginClass = {}
        for p in pluginClasses:
            pluginClass[p.__name__] = p
        return pluginClass
    else:
        assert (0)
コード例 #20
0
    def __init__(self, parent):
        wx.Dialog.__init__(self, parent, -1, "About OpenSTV")

        sizer = wx.BoxSizer(wx.VERTICAL)

        fn = os.path.join(getHome(), "Icons", "splash.png")
        bmp = wx.Image(fn, wx.BITMAP_TYPE_PNG).ConvertToBitmap()
        bm = wx.StaticBitmap(self, -1, bmp)
        sizer.Add(bm)

        button = wx.Button(self, wx.ID_OK, "Close")
        button.SetDefault()
        sizer.Add(button, 0, wx.ALIGN_CENTER | wx.ALL, 5)

        sizer.Fit(self)
        self.SetAutoLayout(True)
        self.SetSizer(sizer)
コード例 #21
0
    def calc(self):
        if self.check():
            try:
                self.appendLog("step 1: 创建基础数据")
                initialDates(self.dbname, self.dateEdit.date().toPyDate(), self.dateEdit_2.date().toPyDate())
                self.appendLog("OK")
 
#                 self.appendLog("step 2: 合并指纹考勤")
#                 executeSQL(self.dbname, getHome() + "/sql/2-合并soho-tongpu.sql")
#                 self.appendLog("OK")
#  
#                 self.appendLog("step 3: groupby上下班时间")
#                 executeSQL(self.dbname, getHome() + "/sql/3-groupby上下班时间.sql")
#                 self.appendLog("OK")
#  
#                 self.appendLog("step 4: 制作考勤表")
#                 executeSQL(self.dbname, getHome() + "/sql/4-制作考勤表.sql")
#                 self.appendLog("OK")
#  
#                 self.appendLog("step 5: 杂项处理")
#                 executeSQL(self.dbname, getHome() + "/sql/5-杂项处理.sql")
#                 self.appendLog("OK")

                root = getHome() + "/sql/"
                files = os.listdir(root)
                files.sort()
                for i in files:
                    if os.path.isfile(os.path.join(root,i)):
                        self.appendLog("Execute SQL: " + i)
                        executeSQL(self.dbname, os.path.join(root,i))
                        self.appendLog("OK")
                
                self.appendLog("step 6: 导出考勤表(考勤结果.xlsx)")
                #导出考勤excel表
                exportSQLite32Excel(self.dbname, "t_checking_in_all", "考勤结果.xlsx")
                self.appendLog("OK")
                 
            except Exception as e:
                self.appendLog("发生异常,异常消息:" + str(e))
        else:
            self.appendLog("异常退出!")
コード例 #22
0
def doAPIOper(servers, id, verb, noun, queryParams, data):
    home = utils.getHome()
    if servers is None:
        with open('{0}/.{1}/{2}/servers.yaml'.format(home, "kcluster",
                                                     id)) as fp:
            servers = yaml.safe_load(fp)["Servers"]
    elif noun != "servers":
        resp = doAPIOper(servers, id, "get", "servers", queryParams, data)
        if resp.status_code != 200:
            return resp
        id = resp.json()["ClusterID"]

    def getWithDebug(req):
        print("REQ: {0}".format(req))
        print("QUERYPARAMS: {0}".format(queryParams))
        resp = requests.get(req, params=queryParams, verify=sslVerify)
        print("RESP: {0}".format(resp))
        return resp

    #print("Verify={0}".format(sslVerify))

    if verb == "get":
        reqFn = lambda req: requests.get(
            req, params=queryParams, verify=sslVerify)
        #reqFn=getWithDebug
    elif verb == "create":
        reqFn = lambda req: requests.post(
            req, params=queryParams, json=data, verify=sslVerify)
    elif verb == "delete":
        reqFn = lambda req: requests.delete(
            req, params=queryParams, verify=sslVerify)
    elif verb == "put":
        reqFn = lambda req: requests.put(
            req, params=queryParams, json=data, verify=sslVerify)
    else:
        print("Unknown verb {0} - noun {1}".format(verb, noun))
        exit()
    #print("Verb: {0} Noun: {1} Servers: {2} QueryParams: {3} Data: {4}".format(verb, noun, servers, queryParams, data))
    resp = webutils.tryHttpServers("{0}".format(noun),
                                   servers,
                                   reqFn,
                                   partial(getServers, queryParams),
                                   verify=sslVerify)

    #if resp is not None:
    #    print(json.dumps(resp.json()))

    if resp is not None and resp.status_code == 200 and verb == "get":
        if noun == "user":
            try:
                user = resp.json()['User']
                info = resp.json()['UserInfo']
                utils.merge2Yaml(
                    "{0}/.kcluster/{1}/users.yaml".format(home, id),
                    {user: info})
            except Exception:
                print("Unable to get userinfo from {0}".format(resp.json()))
        elif noun == "servers":
            id = resp.json()["ClusterID"]
            utils.mkdir("{0}/.{1}/{2}".format(home, "kcluster", id))
            webutils.dumpServers(resp, "kcluster/{0}".format(id))
        elif noun == "kubecred":
            dumpKubeCreds(resp.json()['user'], resp.json(), id)

    return resp
コード例 #23
0
  def __init__(self, parent, mode):
    wx.Frame.__init__(self, parent, -1, "Ballot File Editor")

    warnings.showwarning = self.catchWarnings

    self.MakeMenu()
    self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
    self.logfName = ""

    fn = os.path.join(getHome(), "Icons", "blt.ico")
    icon = wx.Icon(fn, wx.BITMAP_TYPE_ICO)
    self.SetIcon(icon)

    # Edit a new ballot file
    if mode == "new":

      # Create an empty ballots class instance
      self.b = Ballots()

      # Get the candidate names from the user
      dlg = CandidatesDialog(parent, self.b)
      dlg.Center()
      if dlg.ShowModal() != wx.ID_OK:
        dlg.Destroy()
        self.Destroy()
        return
      dlg.Destroy()
        
    # Edit an existing ballot file
    elif mode == "old":
      dlg = wx.FileDialog(self, "Edit Ballot File",
                          style=wx.FD_OPEN|wx.FD_CHANGE_DIR)  # WM: added FD_ prefixes
      if dlg.ShowModal() != wx.ID_OK:
        dlg.Destroy()
        self.Destroy()
        return
      fName = dlg.GetPath()
      dlg.Destroy()

      # Open the file
      try:
        self.b = Ballots()
        self.b.loadUnknown(fName)
      except RuntimeError as msg:
        wx.MessageBox(str(msg), "Error", wx.OK|wx.ICON_ERROR)
        self.Destroy()
        return

    else:
      assert(0)

    # Set the window title to include the filename
    fn = self.b.getFileName()
    if fn is not None:
      title = "%s - Ballot File Editor" % os.path.basename(fn)
    else:
      title = "%s - Ballot File Editor" % "New File"
    self.SetTitle(title)

    # Create a notebook with an editing page and a log page
    nb = wx.Notebook(self, -1)

    self.panel = BallotsPanel(nb, self.b)
    nb.AddPage(self.panel, "Ballots")

    self.logN = 1 # counter for display purposes
    self.log = wx.TextCtrl(nb, -1,
                           style=wx.TE_MULTILINE|wx.TE_READONLY|\
                           wx.TE_WORDWRAP)  # WM: no attribute 'FIXED' so removed
    self.log.SetMaxLength(0)
    nb.AddPage(self.log, "Log")

    # Initialize
    if mode == "new":
      self.panel.NeedToSaveBallots = True
      self.Log("Created a new ballot file.")
    elif mode == "old":
      self.panel.NeedToSaveBallots = False
      self.Log("Loaded %d ballots from file %s." %\
               (self.b.numBallots, os.path.basename(self.b.getFileName())))
    else:
      assert(0)

    # Set up the sizer
    sizer = wx.BoxSizer()
    sizer.Add(nb, 1, wx.EXPAND, 0)
    self.SetSizer(sizer)
    sizer.Fit(self)
    sizer.SetSizeHints(self)
コード例 #24
0
ファイル: daemon.py プロジェクト: cxjchocolate/fanUpdate
    check_exsit


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG,
                format='%(asctime)s [%(levelname)s] %(filename)s[line:%(lineno)d] %(message)s',
                datefmt='%a, %d %b %Y %H:%M:%S')
    if check_exsit("fanUpdater.exe") > 1:
        logging.debug("another fanUpdater.exe exists")
        os._exit(2)
    
    config = getConfig("updater.ini")
    check_version_service = config.get("default", "check_version_service")
    fixpack_service = config.get("default", "fixpack_service")
    
    APP_HOME = getHome() + "/../"
    absolute_version_file      = APP_HOME + "properties/app.version"
    absolute_fixpack_file      = APP_HOME + urllib.parse.unquote(fixpack_service).split('/')[-1].split("?")[0]
    TEMP                       = getHome() + "/TEMP/"

    while True:
        version, md5 = checkUpdate(check_version_service, absolute_version_file)
        if version:
            root = Tk()
            root.withdraw()
            result = askokcancel("fanUpdater", "发现新版本,是否更新?",
                         default=CANCEL)
            print(result)
            root.destroy()
            if result:
                logging.debug("downloading...")
コード例 #25
0
def decodeOIDCToken(cfgfile, user=None):
    cfg = utils.loadYaml("{0}/.{1}/{1}.users.yaml".format(utils.getHome(), cfgfile))
    if user is None:
        user = list(cfg)[0]
    return validateJWTFn[cfg[user]['provider']](cfg[user]['tokens']['id_token'])
コード例 #26
0
def login(provider, cfgfile, useReqs=False):
    (sessionState, user) = get_code(provider, webutils.oidc[provider], useReqs)
    configdir = "{0}/.{1}".format(utils.getHome(), cfgfile)
    pathlib.Path(configdir).mkdir(parents=True, exist_ok=True)
    utils.updateYaml("{0}/{1}.users.yaml".format(configdir, cfgfile), sessionState)
    return sessionState, user
コード例 #27
0
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "OpenSTV", size=(900, 600))

        warnings.showwarning = self.catchWarnings

        # Get method plugins and create dict for easy access
        plugins = getMethodPlugins("classes")
        self.methodClasses1 = {}  # Methods enabled by default
        self.methodClasses2 = {}  # All methods
        self.lastMethod = "Scottish STV"
        for p in plugins:
            if p.status == 1:
                self.methodClasses1[p.longMethodName] = p
            self.methodClasses2[p.longMethodName] = p
        self.methodClasses = self.methodClasses1  # Methods currently viewable to user

        self.breakTiesRandomly = False

        fn = os.path.join(getHome(), "Icons", "pie.ico")
        self.icon = wx.Icon(fn, wx.BITMAP_TYPE_ICO)
        self.SetIcon(self.icon)

        self.lastBallotFile = ""
        self.electionList = []
        self.menuBar = wx.MenuBar()
        self.MakeMenu()
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)

        # create a notebook
        self.notebook = wx.Notebook(self, -1)

        # create a console window
        # WM: Removed wx.FIXED from style
        self.console = wx.TextCtrl(self.notebook, -1,
                                   style=wx.TE_MULTILINE|wx.TE_READONLY|\
                                   wx.TE_WORDWRAP|wx.TE_RICH2)
        self.console.SetMaxLength(0)
        ps = self.console.GetFont().GetPointSize()
        font = wx.Font(ps, wx.MODERN, wx.NORMAL, wx.NORMAL)
        self.console.SetFont(font)

        # add the console as the first page
        self.notebook.AddPage(self.console, "Console")
        self.output = Output(self.notebook)
        sys.stdout = self.output
        sys.stderr = self.output

        self.introText = """\
OpenSTV Copyright 2003-2010 Jeffrey O'Neill
GNU General Public License
See Help->License for more details.

To run an election with an existing ballot file, select "New Election" from
the File menu.

To create a new ballot file, select "Create New Ballot File" from the File
menu.  To edit an existing ballot file, select "Edit Ballot File" from the
File menu.

For more information about the operation of OpenSTV, see the Help menu, go
to www.OpenSTV.org, or send an email to [email protected].    
"""
        self.console.AppendText(self.introText)
コード例 #28
0
    csvfile = os.path.dirname(file) + "/temp/" + os.path.basename(file).split(".")[0] + ".csv"
    utils.Excel2CSV(file, csvfile)
    sql = "\".mode csv\" \".import {0} {1}\""
    return createCommand(dbname, sql.format(csvfile, tablename), type="SQLite3_Win32").execute()

def executeSQL(dbname, file):
    return createCommand(dbname, file, type="SQLite3_Win32").execute()

def exportSQLite32Excel(dbname, tblname, file):
    try:
        db = SqliteDatabase(dbname)
        sql =  "select * from {0}".format(tblname,)
        result = db.execute_sql(sql)
        utils.writeExcel(result, file, 6, 2)
        utils.writeCreateTime(file, 2, 4)
    except Exception as e:
        logging.debug(e)
    finally:
        db.close() 
   
if __name__ == "__main__":
    logfile = getHome() + "/timesheet.log"
    logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s [%(levelname)s] %(filename)s[line:%(lineno)d] %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S',
                    filename=logfile)
    app=QApplication(sys.argv)
    dialog=TimeSheetDialog()
    dialog.show()
    app.exec_()
コード例 #29
0
 def openFile(self, title):
     s=QFileDialog.getOpenFileName(self,title,getHome(),"Excel工作簿(*.xlsx)")    
     return s
コード例 #30
0
def getServers(queryParams, server):
    resp = doAPIOper([server], None, "get", "servers", queryParams, None)
    id = resp.json()["ClusterID"]
    utils.mkdir("{0}/.{1}/{2}".format(utils.getHome(), "kcluster", id))
    return resp, "kcluster/{0}".format(id)