Beispiel #1
0
    def draw_texts(self, config, user, bg):
        draw = ImageDraw.Draw(bg)
        default = config.get('font', current_app.get_data_path('fonts/yh.ttf'))
        for line in config.get('lines', []):
            size = line.get('size', 18)
            font = ImageFont.truetype(line.get('font', default), size)
            x = line.get('x', 0)
            y = line.get('y', 0)

            texts = line.get('texts', [])
            if x == 'center':
                x, limit = self.textsize(user, draw, font, bg.size[0], texts)

            for text in texts:
                color = line.get('color', '#333333')
                if type(text) in [list, tuple]:
                    text, color = text[0], text[1]
                text = text.replace('<id>', str(user.id))
                text = text.replace('<nickname>', user.nickname[:limit] or '佚名')
                text = text.replace('<expire>', (
                    self.modified + timedelta(days=30)).strftime('%Y-%m-%d'))
                width, _ = draw.textsize(text, font=font)
                draw.text((x, y), text, font=font, fill=color)
                x += width
        del draw
        return bg
Beispiel #2
0
    def draw_texts(self, config, user, bg):
        draw = ImageDraw.Draw(bg)
        default = config.get('font', current_app.get_data_path('fonts/yh.ttf'))
        for line in config.get('lines', []):
            size = line.get('size', 18)
            font = ImageFont.truetype(line.get('font', default), size)
            x = line.get('x', 0)
            y = line.get('y', 0)

            texts = line.get('texts', [])
            if x == 'center':
                x, limit = self.textsize(user, draw, font, bg.size[0], texts)

            for text in texts:
                color = line.get('color', '#333333')
                if type(text) in [list, tuple]:
                    text, color = text[0], text[1]
                text = text.replace('<id>', str(user.id))
                text = text.replace('<nickname>', user.nickname[:limit]
                                    or '佚名')
                text = text.replace('<expire>',
                                    (self.modified +
                                     timedelta(days=30)).strftime('%Y-%m-%d'))
                width, _ = draw.textsize(text, font=font)
                draw.text((x, y), text, font=font, fill=color)
                x += width
        del draw
        return bg
Beispiel #3
0
def create_qrcode(url):
    A, B, C = 480, 124, 108
    qr = _qrcode.QRCode(version=2,
                        box_size=10,
                        border=1,
                        error_correction=_qrcode.constants.ERROR_CORRECT_M)
    qr.add_data(url)
    qr.make(fit=True)
    im = qr.make_image()
    im = im.convert("RGBA")
    im = im.resize((A, A), Image.BILINEAR)

    em = Image.new("RGBA", (B, B), "white")
    im.paste(em, ((A - B) / 2, (A - B) / 2), em)

    path = current_app.get_data_path('logo.jpg')
    if os.path.exists(path):
        with open(path) as fd:
            icon = Image.open(StringIO(fd.read()))
        icon = icon.resize((C, C), Image.ANTIALIAS)
        icon = icon.convert("RGBA")
        im.paste(icon, ((A - C) / 2, (A - C) / 2), icon)

    stream = StringIO()
    im.save(stream, format='png')
    return dict(stream=stream, format='png')
Beispiel #4
0
    def create_bg(self, config, user, qr):
        logo = config.get('logo', current_app.get_data_path('imgs/logo.jpg'))
        bgpath = config.get('bg')
        if bgpath:
            with open(bgpath) as fd:
                bg = Image.open(StringIO(fd.read()))
            qr_x = config.get('qr_x', (bg.size[0] - qr.size[0]) / 2)
            qr_y = config.get('qr_y', bg.size[1] / 2)

            bg.convert("RGBA")
            bg.paste(qr, (qr_x, qr_y), qr)

            if user.avatar:
                ic = Image.open(StringIO(user.avatar.content))
            else:
                with open(logo) as fd:
                    ic = Image.open(StringIO(fd.read()))

            avatar_width = config.get('avatar_width', ic.size[0])
            avatar_x = config.get('avatar_x', (bg.size[0] - avatar_width) / 2)
            avatar_y = config.get('avatar_y', bg.size[1] / 2)
            ic = ic.resize((avatar_width, avatar_width), Image.ANTIALIAS)
            ic = ic.convert("RGBA")

            if config.get('avatar_circle', False):
                bigsize = (ic.size[0] * 3, ic.size[1] * 3)
                mask = Image.new('L', bigsize, 0)
                draw = ImageDraw.Draw(mask)
                draw.ellipse((0, 0) + bigsize, fill=255)
                del draw
                mask = mask.resize(ic.size, Image.ANTIALIAS)
                ic.putalpha(mask)
            bg.paste(ic, (avatar_x, avatar_y), ic)
            return bg
        return qr
Beispiel #5
0
    def create_qrcode(self, config):
        logo = config.get('logo', current_app.get_data_path('imgs/logo.jpg'))
        A, B, C = 250, 66, 58
        qr = qrcode.QRCode(version=2,
                           box_size=10,
                           border=1,
                           error_correction=qrcode.constants.ERROR_CORRECT_M)
        qr.add_data(self.url)
        qr.make(fit=True)
        im = qr.make_image()
        im = im.convert("RGBA")
        im = im.resize((A, A), Image.BILINEAR)

        if config.get('qr_logo', True):
            em = Image.new("RGBA", (B, B), "white")
            im.paste(em, ((A - B) / 2, (A - B) / 2), em)

            with open(logo) as fd:
                icon = Image.open(StringIO(fd.read()))
            icon = icon.resize((C, C), Image.ANTIALIAS)
            icon = icon.convert("RGBA")
            im.paste(icon, ((A - C) / 2, (A - C) / 2), icon)

        qr_width = config.get('qr_width', im.size[0])
        im = im.resize((qr_width, qr_width), Image.BILINEAR)
        return im
Beispiel #6
0
    def save_menu(self):
        menus = request.form.get('menus')
        Item.set_data('admin_menus', menus, name='管理菜单')

        filename = current_app.get_data_path('admin.menus.json')
        with open(filename, 'w+') as fd:
            fd.write(menus)

        for admin in current_app.extensions.get('admin', []):
            admin._refresh()
        return json_success(msg='保存成功')
Beispiel #7
0
    def set_menu(self):
        menus = json.loads(Item.data('admin_menus', '[]', name='管理菜单'))

        if not menus:
            filename = current_app.get_data_path('admin.menus.json')
            if os.path.isfile(filename):
                try:
                    with open(filename) as fd:
                        menus = json.loads(fd.read())
                except:
                    pass

            if not menus:
                menus = json.loads(MENUS_JSON)

        views = dict()
        cates = dict()
        for view in View.objects.all():
            if view.type == view.TYPE_CATE:
                cates[view.name] = dict(id=view.name,
                                        name=view.label,
                                        icon=view.icon,
                                        children=[])
            else:
                views[view.name] = dict(id=view.name,
                                        name=view.label,
                                        icon=view.icon)
        if menus:
            right = []
            for menu in menus:
                if menu['id'] in views:
                    item = views[menu['id']]
                    right.append(item)
                    del views[menu['id']]
                elif menu['id'] in cates:
                    item = cates[menu['id']]
                    if 'children' in item and 'children' in menu:
                        for child in menu['children']:
                            if child['id'] in views:
                                item['children'].append(views[child['id']])
                                del views[child['id']]
                    right.append(item)
                    del cates[menu['id']]
        else:
            right = [dict(name='仪表盘', icon='diamond')]
        return self.render('common/menu.html',
                           cates=cates,
                           views=views,
                           right=right)
Beispiel #8
0
    def create_bg(self, config, user, qr):
        logo = config.get('logo', current_app.get_data_path('imgs/logo.jpg'))
        bgpath = config.get('bg')
        if bgpath:
            with open(bgpath) as fd:
                bg = Image.open(StringIO(fd.read()))
            qr_x = config.get('qr_x', (bg.size[0] - qr.size[0]) / 2)
            qr_y = config.get('qr_y', bg.size[1] / 2)

            bg.convert("RGBA")
            bg.paste(qr, (qr_x, qr_y), qr)

            avatar_show = config.get('avatar_show', True)
            if not avatar_show:
                return bg

            if user.avatar:
                ic = Image.open(StringIO(user.avatar.content))
            else:
                with open(logo) as fd:
                    ic = Image.open(StringIO(fd.read()))

            avatar_width = config.get('avatar_width', ic.size[0])
            avatar_x = config.get('avatar_x', (bg.size[0] - avatar_width) / 2)
            avatar_y = config.get('avatar_y', bg.size[1] / 2)
            ic = ic.resize((avatar_width, avatar_width), Image.ANTIALIAS)
            ic = ic.convert("RGBA")

            if config.get('avatar_circle', False):
                bigsize = (ic.size[0] * 3, ic.size[1] * 3)
                mask = Image.new('L', bigsize, 0)
                draw = ImageDraw.Draw(mask)
                draw.ellipse((0, 0) + bigsize, fill=255)
                del draw
                mask = mask.resize(ic.size, Image.ANTIALIAS)
                ic.putalpha(mask)
            bg.paste(ic, (avatar_x, avatar_y), ic)
            return bg
        return qr
Beispiel #9
0
def create_qrcode(url):
    A, B, C = 480, 124, 108
    qr = _qrcode.QRCode(
        version=2, box_size=10, border=1,
        error_correction=_qrcode.constants.ERROR_CORRECT_M)
    qr.add_data(url)
    qr.make(fit=True)
    im = qr.make_image()
    im = im.convert("RGBA")
    im = im.resize((A, A), Image.BILINEAR)

    em = Image.new("RGBA", (B, B), "white")
    im.paste(em, ((A - B) / 2, (A - B) / 2), em)

    with open(current_app.get_data_path('logo.jpg')) as fd:
        icon = Image.open(StringIO(fd.read()))
    icon = icon.resize((C, C), Image.ANTIALIAS)
    icon = icon.convert("RGBA")
    im.paste(icon, ((A - C) / 2, (A - C) / 2), icon)

    stream = StringIO()
    im.save(stream, format='png')
    return dict(stream=stream, format='png')
Beispiel #10
0
    def create_qrcode(self, config):
        logo = config.get('logo', current_app.get_data_path('imgs/logo.jpg'))
        A, B, C = 250, 66, 58
        qr = qrcode.QRCode(version=2, box_size=10, border=1,
                           error_correction=qrcode.constants.ERROR_CORRECT_M)
        qr.add_data(self.url)
        qr.make(fit=True)
        im = qr.make_image()
        im = im.convert("RGBA")
        im = im.resize((A, A), Image.BILINEAR)

        if config.get('qr_logo', True):
            em = Image.new("RGBA", (B, B), "white")
            im.paste(em, ((A - B) / 2, (A - B) / 2), em)

            with open(logo) as fd:
                icon = Image.open(StringIO(fd.read()))
            icon = icon.resize((C, C), Image.ANTIALIAS)
            icon = icon.convert("RGBA")
            im.paste(icon, ((A - C) / 2, (A - C) / 2), icon)

        qr_width = config.get('qr_width', im.size[0])
        im = im.resize((qr_width, qr_width), Image.BILINEAR)
        return im