def authenticate(): """Authenticate user. Returns authorized service object. On first run, this will copy the credentials to working directory for future use. Args: theme: UI theme ("reddit" or "darkblue14") """ logging.info("Begin authentication") credPath = os.path.join((os.getenv("APPDATA") + "\\Haukiposti"), "credentials.json") tokenPath = os.path.join((os.getenv("APPDATA") + "\\Haukiposti"), "token.pickle") creds = None # The file token.pickle stores the user's access and refresh tokens, and is # created automatically when the authorization flow completes for the first # time. if os.path.exists(tokenPath): with open(tokenPath, 'rb') as token: creds = pickle.load(token) logging.info("Credentials loaded") # If there are no (valid) credentials available, let the user log in. if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: try: creds.refresh(Request()) logging.info("Credentials refreshed.") except RefreshError as e: logging.error(e) if os.path.exists(credPath): flow = InstalledAppFlow.from_client_secrets_file( credPath, SCOPES) creds = flow.run_local_server(port=0) else: json = common.resource_path("credentials.json") flow = InstalledAppFlow.from_client_secrets_file(json, SCOPES) creds = flow.run_local_server(port=0) # Save the credentials for the next run try: with open(tokenPath, 'wb') as token: pickle.dump(creds, token) except Exception as e: logging.exception(e) return logging.info("Credentials saved.") service = build('gmail', 'v1', credentials=creds) return service
def definePage(c, config, receiver, path, message, duedate, subject, reference, i, logo=None): """ Args: config = config list, receiver = invoice receiver object path = path to output folder message = message to be attached to the invoice duedate = due date of the invoice as a string subject = subject line of the invoice reference = Reference number for the invoice i = index number for barcode logo = path to the logo file if spesified. Default None """ try: sg.theme(config[0]) #measurements leveys, korkeus = A4 transSizeX = leveys / 210 transSizeY = korkeus / 297 base = common.resource_path("Tilisiirto_pohja.jpg") margin = transSizeX * 27 margin2 = transSizeX * 119 margin3 = margin2 + transSizeX * 18 # Document settings c.setAuthor(config[2]) c.setTitle(subject) c.setSubject(subject) c.setCreator(("Haukiposti " + common.version())) if logo != "": c.drawImage(logo, 25, korkeus - 110, width=110, height=110, preserveAspectRatio=True) c.line(25, korkeus - 100, leveys - 25, korkeus - 100) c.drawImage(base, 0, 10, width=(transSizeX * 210), height=(transSizeY * 101.6), preserveAspectRatio=True) # bank transfer base c.setFont("Helvetica-Bold", 18) c.drawString(250, korkeus - 60, subject) c.setFont("Helvetica", 11) # TODO Saate m = c.beginText() m.setTextOrigin(25, korkeus - 135) newLines = message.split('\n') for item in newLines: line = common.markdownParserPDF(item, receiver) if line == -1: sg.PopupOK( "Viallinen muotoilu saatteessa. Tarkista, että suljet ja aloitat tagit oikein. Keskeytetään." ) return -1 logging.debug(line) if line == []: break elif len(line) == 2 and type(line[1]) == str: if line[0] == [False, False, False ] or line[0] == [False, False, True]: m.setFont("Helvetica", 12) elif line[0] == [True, False, False ] or line[0] == [True, False, True]: m.setFont("Helvetica-Bold", 12) elif line[0] == [False, True, False ] or line[0] == [False, True, True]: m.setFont("Helvetica-Oblique", 12) elif line[0] == [True, True, False ] or line[0] == [True, True, True]: m.setFont("Helvetica-BoldOblique", 12) m.textOut(line[1]) else: for text in line: if text[0] == [False, False, False ] or text[0] == [False, False, True]: m.setFont("Helvetica", 12) elif text[0] == [True, False, False ] or text[0] == [True, False, True]: m.setFont("Helvetica-Bold", 12) elif text[0] == [False, True, False ] or text[0] == [False, True, True]: m.setFont("Helvetica-Oblique", 12) elif text[0] == [True, True, False ] or text[0] == [True, True, True]: m.setFont("Helvetica-BoldOblique", 12) m.textOut(text[1]) m.moveCursor(0, 12) c.drawText(m) # Receiver information account = config[3].replace(' ', '') account = account[:4] + " " + account[4:8] + " " + account[ 8:12] + " " + account[12:16] + " " + account[16:] c.drawString(margin, getY(5), account) # receiver account number c.drawString(margin, getY(11), config[2]) # payment receiver c.setFontSize(15) c.drawString(margin2, getY(5), config[5]) # Payer information textObject = c.beginText() textObject.setTextOrigin(margin, getY(16)) textObject.setFont("Helvetica", 11) textObject.textLine( (receiver.firstname + " " + receiver.lastname)) # payer name if receiver.contact != "": textObject.textLine(receiver.contact) # payer contact, if any textObject.textLine(receiver.address) # payer address textObject.textLine((receiver.postalno + " " + receiver.city)) # payer postalno and city c.drawText(textObject) c.setFontSize(11) # Reference information c.drawString(margin2, getY(25), "Käytäthän maksaessasi viitenumeroa.") ref = reference[:5] + " " + reference[5:] c.drawString(margin3, getY(30), ref) c.drawString(margin3, getY(34), duedate) # Amount amount = None memberList = [config[4]] parser = csv.reader(memberList) memberString = [] for fields in parser: for field in fields: string = field.split(",") member = string[0] + ":" + string[1] memberString.append(member) for item in memberString: cl = item.split(':') if cl[0].lower() == receiver.membertype.lower(): if len(cl[1].split('.')) > 1: amount = cl[1] else: amount = cl[1] + ".00" if amount == None: amount = "" c.drawString((margin3 + transSizeX * 40), getY(34), amount) virtualbc, bc_img = createBarcode(reference, config[3], amount, duedate, i) c.setFontSize(9.4) c.drawString(37, 22 + transSizeY * 12, virtualbc) c.drawImage(bc_img, 30, 17, transSizeX * 105, transSizeY * 12, preserveAspectRatio=False) c.showPage() except Exception as e: logging.exception(e)
def main(): try: logname = os.path.join((os.getenv("APPDATA") + "\\Haukiposti"), "haukilog.log") logpath = (os.getenv("APPDATA") + "\\Haukiposti") if os.path.exists(logpath) == False: os.mkdir(logpath) logging.basicConfig(filename=logname, level=logging.INFO, format='%(asctime)s %(levelname)s - %(message)s', datefmt='%d/%m/%Y %H:%M:%S') logging.info("HaukiPosti {0} - Rami Saarivuori & Aarne Savolainen (c) 2020".format(common.version())) configs = configParsing() # -- Theme -- sg.theme(configs[0]) # -- Menu definition -- menu_def = [["Tiedosto", ["Poistu"]], ["Tietoa", ["Apua", "Tietoa", "Lisenssit"]]] # -- The layout -- layout = [ [sg.Menu(menu_def)], [sg.Image(common.resource_path(r"haukiposti_small.png"), pad=(26,0))], [sg.Text("Haukiposti", font=("Verdana", 15, "bold"), size=(10,1), justification="center")], [sg.Button("Kirjaudu", font=("Verdana", 12), size=(15, 1), key="login")], [sg.Button("Massaposti", font=("Verdana", 12), size=(15, 1))], [sg.Button("Laskutus", font=("Verdana", 12), size=(15, 1))], [sg.Button("Tarra-arkit", font=("Verdana", 12), size=(15, 1))], [sg.Button("Asetukset", font=("Verdana", 12), size=(15, 1))], [sg.Button("Poistu", font=("Verdana", 12), size=(15, 1))]] # -- Window creation -- window1 = sg.Window("Haukiposti", layout) # -- Window functionality -- service = None while True: event, values = window1.read() if event == "Massaposti": window1.Hide() logging.info("Masspost") masspost.massPost(configs, service) window1.UnHide() elif event == "Laskutus": window1.Hide() logging.info("Billing") billing.billing(configs, service) window1.UnHide() elif event == "Tarra-arkit": window1.Hide() logging.info("Stickerheet") stickersheet.stickersheet(configs) window1.UnHide() elif event == "Asetukset": window1.Hide() logging.info("Settings") settings.settings(configs) configs = updateConfig(configs) if os.path.exists(os.getenv("APPDATA") + "\\Haukiposti\\token.pickle") == False: window1["login"].update("Kirjaudu", disabled=False) service = None window1.UnHide() elif event == "login": service = mail.authenticate() if service: sg.PopupOK("Todennus onnistui.", font=("Verdana", 12)) window1["login"].update("Kirjauduttu", disabled=True) logging.info("Login succesful") else: sg.PopupOK("Todennus epäonnistui.", font=("Verdana", 12)) logging.error("Login unsuccesful") elif event == "Apua": sg.PopupOK("Tämä on päänäkymä. Valitse mitä haluat tehdä painamalla nappia.", font=("Verdana", 12)) elif event == "Tietoa": sg.PopupOK("Haukiposti {0}\n\nRami Saarivuori\nAarne Savolainen\n(c) 2020".format(common.version()), font=("Verdana", 12)) elif event == "Lisenssit": sg.popup_scrolled(common.licenses(), font=("Verdana", 12), title="Haukiposti - Lisenssit") elif event in (None, "Poistu"): break if os.path.exists(os.path.join((os.getenv("APPDATA") + "\\Haukiposti"), "preview.html")): os.remove(os.path.join((os.getenv("APPDATA") + "\\Haukiposti"), "preview.html")) folderpath = os.path.join((os.getenv("APPDATA") + "\\Haukiposti"), "images") for i in os.listdir(folderpath): os.remove(folderpath+ "/"+i) os.rmdir(folderpath) logging.info("Message previews deleted.") if os.path.exists(os.path.join((os.getenv("APPDATA") + "\\Haukiposti"), "barcodes")): folderpath = os.path.join((os.getenv("APPDATA") + "\\Haukiposti"), "barcodes") for i in os.listdir(folderpath): os.remove(folderpath+ "/"+i) os.rmdir(folderpath) logging.info("Barcodes deleted.") if os.path.exists(os.path.join((os.getenv("APPDATA") + "\\Haukiposti"), "preview.pdf")): os.remove(os.path.join((os.getenv("APPDATA") + "\\Haukiposti"), "preview.pdf")) logging.info("Invoice preview deleted.") window1.close() logging.info("Exit, Code 0") sys.exit(0) except Exception as e: logging.exception(e)
downloadlogstr.set('开始下载') for i in range(section[0], section[1] + 1): downloadlogstr.set('正在下载第' + str(i) + '张CG图片') if i == 386 or i == 387: downloadlogstr.set('正在下载被和谐的图片,下载速度较慢') window.update() common.download(i, downloadpathstr.get()) time.sleep(0.1) downloadlogstr.set('下载完成') tkinter.messagebox.showinfo('提示', '下载完成') window = tkinter.Tk() window.title('Summer Pockets CG资源下载器GUI版') window.geometry('500x550') window.iconbitmap(common.resource_path('SummerPockets.ico')) # 预览模块 showpla = tkinter.Label(window, text='图片预览功能', font=('Arial', 20), width=100, height=2) showpla2 = tkinter.Label(window, text='请在下方输入一个数字(图片编号),然后点击"预览"按钮', font=('Arial', 12)) et = tkinter.Entry(window, relief='sunken', bd=5) showmainbutton = tkinter.Button(window, text='预览', bg='blue', font=('Arial', 20), width=10,
def __init__(self): BoxLayout.__init__(self) self.to_get = deque() self.to_set = OrderedDict() self.block_set = False self.popup = InfoPopup() self.reset_popup = ResetPopup() self.reset_popup.cb = self.reset_eeprom self.ph = port_handler(self.sh_cb) self.screens = { "cfg": Builder.load_file(resource_path('data', 'cfg.kv')), "profile": Builder.load_file(resource_path('data', 'profile.kv')) } eg = self.screens["profile"].ids.eg self.profile_graph = eg.graph self.profile_graph.demo_cb = self.play_demo freq_axis = Axis(self.profile_graph, min=0, max=2000, step=100, auto_max=True, auto_min=False, format="%d Hz") time_axis = Axis(self.profile_graph, min=0, max=2000, step=100, auto_max=True, auto_min=False, left=False, format="%d ms") self.profile_frequency = LineData(default_freq, freq_axis, name="Frequency", units="Hz", color=(0.59, 0.73, 0.80), min=0, max=2000) self.profile_pause = LineData(default_pause, time_axis, name="Pause", units="ms", color=(0.97, 0.27, 0.29), min=0, max=2000) self.profile_length = LineData(default_length, time_axis, name="Length", units="ms", color=(0.86, 0.86, 0.86), min=0, max=2000) self.profile_frequency.on_change = lambda point, value: self.set_value( "freq_%d" % point, value) self.profile_pause.on_change = lambda point, value: self.set_value( "pause_%d" % point, value) self.profile_length.on_change = lambda point, value: self.set_value( "length_%d" % point, value) self.screens["profile"].ids.profile_1.bind( on_press=lambda __: self.profile_set(1)) self.screens["profile"].ids.profile_2.bind( on_press=lambda __: self.profile_set(2)) self.screens["profile"].ids.profile_3.bind( on_press=lambda __: self.profile_set(3)) self.screens["profile"].ids["lift_index_1"].bind( on_press=lambda __: self.index_lift_set(1)) self.screens["profile"].ids["lift_index_2"].bind( on_press=lambda __: self.index_lift_set(2)) self.screens["profile"].ids["lift_index_3"].bind( on_press=lambda __: self.index_lift_set(3)) self.screens["profile"].ids["lift_index_4"].bind( on_press=lambda __: self.index_lift_set(4)) self.screens["profile"].ids["lift_index_5"].bind( on_press=lambda __: self.index_lift_set(5)) self.screens["profile"].ids["sink_index_1"].bind( on_press=lambda __: self.index_sink_set(1)) self.screens["profile"].ids["sink_index_2"].bind( on_press=lambda __: self.index_sink_set(2)) self.screens["profile"].ids["sink_index_3"].bind( on_press=lambda __: self.index_sink_set(3)) self.screens["profile"].ids["sink_index_4"].bind( on_press=lambda __: self.index_sink_set(4)) self.screens["profile"].ids["sink_index_5"].bind( on_press=lambda __: self.index_sink_set(5)) #cfg callbacks self.screens["cfg"].ids.volume.ids.slider.bind( value=lambda __, value: self.set_value("volume", value)) self.screens["cfg"].ids.auto_power_off.ids.slider.bind( value=lambda __, value: self.set_value("auto_power_off", value * 60 )) self.screens["cfg"].ids.auto_power_off_switch.bind( active=self.auto_power_off_switch) self.screens["cfg"].ids.silent_start.bind( active=lambda __, value: self.set_value("silent_start", value)) self.screens["cfg"].ids.fluid_audio.bind( active=lambda __, value: self.set_value("fluid_audio", value)) self.screens["cfg"].ids.profile_1.bind( on_press=lambda __: self.profile_set(1)) self.screens["cfg"].ids.profile_2.bind( on_press=lambda __: self.profile_set(2)) self.screens["cfg"].ids.profile_3.bind( on_press=lambda __: self.profile_set(3)) self.screens["cfg"].ids.lift_1.bind( value=lambda __, value: self.set_value("lift_1", value * 100)) self.screens["cfg"].ids.lift_2.bind( value=lambda __, value: self.set_value("lift_2", value * 100)) self.screens["cfg"].ids.lift_3.bind( value=lambda __, value: self.set_value("lift_3", value * 100)) self.screens["cfg"].ids.lift_4.bind( value=lambda __, value: self.set_value("lift_4", value * 100)) self.screens["cfg"].ids.lift_5.bind( value=lambda __, value: self.set_value("lift_5", value * 100)) self.screens["cfg"].ids.sink_1.bind( value=lambda __, value: self.set_value("sink_1", value * 100)) self.screens["cfg"].ids.sink_2.bind( value=lambda __, value: self.set_value("sink_2", value * 100)) self.screens["cfg"].ids.sink_3.bind( value=lambda __, value: self.set_value("sink_3", value * 100)) self.screens["cfg"].ids.sink_4.bind( value=lambda __, value: self.set_value("sink_4", value * 100)) self.screens["cfg"].ids.sink_5.bind( value=lambda __, value: self.set_value("sink_5", value * 100)) self.screen = None self.set_screen("cfg") self.ph.start()
def build(self): self.icon = resource_path("data", "icon.png") self.layout = AppLayout() return self.layout
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang.builder import Builder from kivy.logger import Logger from kivy.garden import iconfonts from port_handler import port_handler from kivy.uix.popup import Popup from kivy.lang import Builder from collections import deque, OrderedDict from graph import EditableGraph, Axis, LineData from kivy.clock import Clock from common import resource_path iconfonts.register('default_font', resource_path('data', 'fa-regular-400.ttf'), resource_path('data', 'fontawesome.fontd')) iconfonts.register('default_font', resource_path('data', 'fa-brands-400.ttf'), resource_path('data', 'fontawesome.fontd')) iconfonts.register('default_font', resource_path('data', 'fa-solid-900.ttf'), resource_path('data', 'fontawesome.fontd')) # default_freq = [90, 91, 93, 96, 100, 105, 111, 118, 126, 135, 145, 156, 168, 181, 195, 210, 226, 243, 261, 280, 300, 325, 360, 405, 460, 525, 600, 685, 780, 875, 960, 1025, 1070, 1105, 1130, 1150, 1165, 1180, 1195, 1210, 1225] # default_pause = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 370, 288, 233, 192, 163, 142, 128, 120, 112, 105, 98, 91, 84, 78, 72, 66, 60, 54, 48, 42] # default_length = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 265, 215, 180, 150, 125, 108, 97, 90, 83, 77, 72, 67, 62, 57, 52, 47, 42, 37, 32, 27] Builder.load_file(resource_path('data', 'vario2.kv')) default_freq = [0] * 41 default_pause = [0] * 41 default_length = [0] * 41