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
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
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')
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
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
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='保存成功')
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)
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
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')
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