""" This file implements an avatar studio """ import py_avataaars as pa from py_avataaars import PyAvataaar as Avatar import pandas as pd import numpy as np import transport from transport import providers from enum import Enum import io import base64 import copy # _map = {'eye type':pa.EyesType,'frame style':pa.AvatarStyle,'race':pa.SkinColor,'hair color':pa.HairColor,'facial hair':pa.FacialHairType, 'facial hair color':pa.HairColor,'hair dress':pa.TopType,'mouth':pa.MouthType,'nose':pa.NoseType,'eyebrows':pa.EyebrowType } # _vmap= {'eye type':'eye_type','frame style':'style','race':'skin_color','hair color':'hair_color','facial hair color':'facial_hair_color','facial hair':'facial_hair_type','hair dress':'top_type','eyebrows':'eye_brow','nose':'nose_type','mouth':'mouth_type'} # _omap = {'eye_type':pa.EyesType,'style':pa.AvatarStyle} _df = [['eye type','eye_type',pa.EyesType],['frame style','style',pa.AvatarStyle],['hair color','hair_color',pa.HairColor],['race','skin_color',pa.SkinColor],['facial hair','facial_hair_type',pa.FacialHairType], ['facial hair color','facial_hair_color',pa.Color],['mouth','mouth_type',pa.MouthType],['hat color','hat_color',pa.Color],['accessory','accessories_type',pa.AccessoriesType],['nose','nose_type',pa.NoseType],['eyebrows','eyebrow_type',pa.EyebrowType], ['hair dress','top_type',pa.TopType],['clothes', 'clothe_type', pa.ClotheType],['clothe color','clothe_color', pa.Color],['clothe graphics','clothe_graphic_type',pa.ClotheGraphicType] ] _df = pd.DataFrame(_df,columns=['label','variable','values']) # _df.to_csv('/home/steve/me.avatar.csv',index=False) def _parameters(): _out = {'basic':{},'face':{},'clothes':{}} for _index in np.arange(_df.shape[0]) : row = _df.iloc[_index] key = row['label'] if key in ['race','nose','mouth','eyebrows','eye type'] : _id = 'basic' elif 'clothe' in key or key=='accessory': _id = 'clothes' else: _id = 'face' if len( list(row['values'])) < 2 : continue _out[_id][key] = {'values': [{'name':_item.name.replace('_', ' '),'value':_item.value} for _item in row['values']],'variable':row['variable']} return _out def cast(_args) : _params = {} for key in _args : value = int(_args[key]) _info = _df[_df.variable == key].copy() if _info.shape[0] > 0 : _params[key] = list(_info['values'].tolist()[0])[value] # _params[key] = _info['values'].tolist()[value] return _params # def _xparameters() : # """ # This function returns parameters to be used within an HTML context # """ # _orgout = {'basic':{},'extended':{}} # _out = {} # for _key in _map : # # _out[_key] = {'class':_map[_key].__name__,'values':[],"variable":_vmap[_key]} # # _out[_key]['values'] = [{'name':_item.name.replace('_', ' '),'value':_item.value} for _item in _map[_key]] # if _key == 'nose' : # continue # if _key in ['race','nose','mouth','eyebrows','eye type'] : # _out = _orgout['basic'] # else: # _out = _orgout['extended'] # _out[_key] = {'class':_map[_key].__name__,'values':[],"variable":_vmap[_key]} # _out[_key]['values'] = [{'name':_item.name.replace('_', ' '),'value':_item.value} for _item in _map[_key]] # # return _out # return _orgout def _build (_args): """ This function builds the avatar with a set of arguments """ _args = cast(_args) if _args : _avatar = Avatar(**_args) _stream = _avatar.render_png() _stream =io.BytesIO(_stream) _stream = base64.encodebytes(_stream.getvalue()).decode('ascii') else: _stream = None return _stream def _save(_args): """ This function will save the data/candidate to the database :_args {alias,email,stream} """ writer = transport.factory.instance(provider=providers.MONGO,context='write',db='genomix',doc='participants') reader = transport.factory.instance(provider=providers.MONGO,context='read',db='genomix',doc='participants') # # Let us make sure the candidate doesn't exist _df = reader.read(mongo={"find":"participants","filter":{"alias":_args['alias']},"projection":{"_id":0}}) _info = None try: if _df.shape[0] == 0 : writer.write(_args) else: writer.set(_args) _info = "1" except Exception as e: pass return _info def _participants (): reader = transport.factory.instance(provider=providers.MONGO,context='read',db='genomix',doc='participants') _df = reader.read(mongo={"find":"participants","limit":10,"projection":{"_id":0}}) return _df.to_dict(orient='records')