Beispiel #1
0
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
Beispiel #2
0
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)
Beispiel #3
0
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,
Beispiel #5
0
    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()
Beispiel #6
0
 def build(self):
     self.icon = resource_path("data", "icon.png")
     self.layout = AppLayout()
     return self.layout
Beispiel #7
0
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