304 lines
7.9 KiB
Python
304 lines
7.9 KiB
Python
#!/usr/bin/env python
|
|
|
|
import sqlite3
|
|
import click
|
|
from peewee import *
|
|
|
|
if __name__ == '__main__':
|
|
import os, sys
|
|
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
sys.path.insert(0, parent_dir)
|
|
|
|
from controllers import util
|
|
from conf import DATABASE, __version__
|
|
from settings import log, PATH_CP
|
|
|
|
|
|
database = DATABASE
|
|
class BaseModel(Model):
|
|
class Meta:
|
|
database = database
|
|
|
|
|
|
def connect():
|
|
global database
|
|
database.connect()
|
|
log.info('Conectado a la BD...')
|
|
return
|
|
|
|
|
|
class Configuration(BaseModel):
|
|
key = FixedCharField(max_length=50)
|
|
value = FixedCharField(max_length=100)
|
|
|
|
class Meta:
|
|
order_by = ('key',)
|
|
indexes = (
|
|
(('key', 'value'), True),
|
|
)
|
|
|
|
|
|
class Tags(BaseModel):
|
|
tag = FixedCharField(max_length=25, index=True)
|
|
|
|
class Meta:
|
|
order_by = ('tag',)
|
|
|
|
|
|
class Users(BaseModel):
|
|
username = CharField(max_length=50, unique=True)
|
|
first_name = CharField(max_length=50, default='')
|
|
last_name = CharField(max_length=50, default='')
|
|
email = CharField(max_length=200, default='')
|
|
password = CharField(max_length=100)
|
|
is_superuser = BooleanField(default=False)
|
|
is_admin = BooleanField(default=False)
|
|
is_staff = BooleanField(default=False)
|
|
is_active = BooleanField(default=True)
|
|
date_joined = DateTimeField(default=util.now)
|
|
last_login = DateTimeField(null=True)
|
|
|
|
def __str__(self):
|
|
t = '{} {} ({})'
|
|
return t.format(self.first_name, self.last_name, self.username)
|
|
|
|
class Meta:
|
|
order_by = ('username',)
|
|
|
|
|
|
class Clients(BaseModel):
|
|
person_type = IntegerField(default=0)
|
|
rfc = FixedCharField(max_length=13, index=True)
|
|
name = CharField(max_length=1000, index=True)
|
|
street = FixedCharField(max_length=200, default='')
|
|
num_ext = FixedCharField(max_length=25, default='')
|
|
num_int = FixedCharField(max_length=25, default='')
|
|
postal_code = FixedCharField(max_length=15, default='')
|
|
colonia = FixedCharField(max_length=100, default='')
|
|
municipio = FixedCharField(max_length=100, default='')
|
|
state = FixedCharField(max_length=100, default='')
|
|
country = FixedCharField(max_length=100, default='')
|
|
conditions_pay = FixedCharField(max_length=250, default='')
|
|
days_pay = IntegerField(default=0)
|
|
business_days = BooleanField(default=False)
|
|
is_active = BooleanField(default=True)
|
|
commercial_name = CharField(max_length=1000, default='')
|
|
phones = CharField(max_length=500, default='')
|
|
web_page = CharField(max_length=500, default='')
|
|
invoice_email = CharField(max_length=500, default='')
|
|
is_client = BooleanField(default=False)
|
|
is_supplier = BooleanField(default=False)
|
|
is_ong = BooleanField(default=False)
|
|
account_client = FixedCharField(max_length=100, default='')
|
|
account_supplier = FixedCharField(max_length=100, default='')
|
|
notes = CharField(max_length=5000)
|
|
|
|
def __str__(self):
|
|
t = '{} ({})'
|
|
return t.format(self.name, self.rfc)
|
|
|
|
class Meta:
|
|
order_by = ('name',)
|
|
indexes = (
|
|
(('rfc', 'name'), True),
|
|
)
|
|
|
|
|
|
class ClientsTags(BaseModel):
|
|
client = ForeignKeyField(Clients)
|
|
tag = ForeignKeyField(Tags)
|
|
|
|
class Meta:
|
|
indexes = (
|
|
(('client', 'tag'), True),
|
|
)
|
|
|
|
|
|
def authenticate(username, password):
|
|
data = {'login': False, 'msg': 'No Autorizado', 'user': ''}
|
|
try:
|
|
obj = Users.get(Users.username==username, Users.is_active==True)
|
|
except Users.DoesNotExist:
|
|
return data
|
|
|
|
if not util.validate_password(obj.password, password):
|
|
return data
|
|
|
|
obj.last_login = util.now()
|
|
obj.save()
|
|
data['msg'] = ''
|
|
data['login'] = True
|
|
data['user'] = str(obj)
|
|
return data
|
|
|
|
|
|
def get_partners(values):
|
|
if values:
|
|
id = int(values['id'])
|
|
row = Clients.select().where(Clients.id==id).dicts()[0]
|
|
return row
|
|
|
|
rows = Clients.select(Clients.id, Clients.rfc, Clients.name).dicts()
|
|
return {'ok': True, 'rows': tuple(rows)}
|
|
|
|
|
|
def new_partner(values):
|
|
fields = util.clean(values)
|
|
fields['rfc'] = fields['rfc'].upper()
|
|
obj = Clients.create(**fields)
|
|
row = {
|
|
'id': obj.id,
|
|
'cia': obj.cia,
|
|
'rfc': obj.rfc,
|
|
'name': obj.name,
|
|
}
|
|
data = {'ok': True, 'row': row, 'new': True}
|
|
return data
|
|
|
|
|
|
def get_cp(cp):
|
|
con = sqlite3.connect(PATH_CP)
|
|
cursor = con.cursor()
|
|
sql = """
|
|
SELECT colonia, municipio, estado
|
|
FROM colonias, municipios, estados
|
|
WHERE colonias.id_municipio=municipios.id
|
|
AND municipios.id_estado=estados.id
|
|
AND cp=?
|
|
ORDER BY colonia"""
|
|
cursor.execute(sql, (cp,))
|
|
rows = cursor.fetchall()
|
|
cursor.close()
|
|
con.close()
|
|
|
|
data = {}
|
|
if rows:
|
|
data = {
|
|
'estado': rows[0][2],
|
|
'municipio': rows[0][1],
|
|
}
|
|
if len(rows) == 1:
|
|
data['colonia'] = rows[0][0]
|
|
else:
|
|
data['colonia'] = [r[0] for r in rows]
|
|
return data
|
|
|
|
|
|
def _init_values():
|
|
data = (
|
|
{'key': 'version', 'value': __version__},
|
|
{'key': 'rfc_publico', 'value': 'XAXX010101000'},
|
|
{'key': 'rfc_extranjero', 'value': 'XEXX010101000'},
|
|
)
|
|
for row in data:
|
|
try:
|
|
Configuration.create(**row)
|
|
except IntegrityError:
|
|
pass
|
|
log.info('Valores iniciales insertados...')
|
|
return
|
|
|
|
|
|
def create_tables():
|
|
connect()
|
|
tables = [Configuration, Tags, Users, Clients, ClientsTags]
|
|
database.create_tables(tables, True)
|
|
log.info('Tablas creadas correctamente...')
|
|
_init_values()
|
|
return
|
|
|
|
|
|
def migrate_tables():
|
|
connect()
|
|
log.info('Tablas migradas correctamente...')
|
|
return
|
|
|
|
|
|
def create_superuser():
|
|
connect()
|
|
username = input('Introduce el nuevo nombre para el superusuario: ').strip()
|
|
if not username:
|
|
msg = 'El nombre de usuario es requerido'
|
|
log.erro(msg)
|
|
return
|
|
ok, password = util.get_pass()
|
|
if not ok:
|
|
log.error(password)
|
|
return
|
|
try:
|
|
obj = Users.create(username=username, password=password, is_superuser=True)
|
|
except IntegrityError:
|
|
msg = 'El usuario ya existe'
|
|
log.error(msg)
|
|
return
|
|
|
|
log.info('SuperUsuario creado correctamente...')
|
|
return
|
|
|
|
|
|
def change_password():
|
|
connect()
|
|
username = input('Introduce el nombre de usuario: ').strip()
|
|
if not username:
|
|
msg = 'El nombre de usuario es requerido'
|
|
log.error(msg)
|
|
return
|
|
|
|
try:
|
|
obj = Users.get(username=username)
|
|
except Users.DoesNotExist:
|
|
msg = 'El usuario no existe'
|
|
log.error(msg)
|
|
return
|
|
|
|
ok, password = util.get_pass()
|
|
if not ok:
|
|
log.error(password)
|
|
return
|
|
|
|
obj.password = password
|
|
obj.save()
|
|
|
|
log.info('Contraseña cambiada correctamente...')
|
|
return
|
|
|
|
|
|
CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
|
|
help_create_tables = 'Crea las tablas en la base de datos'
|
|
help_migrate_db = 'Migra las tables en la base de datos'
|
|
help_superuser = 'Crea un nuevo super usuario'
|
|
help_change_pass = 'Cambia la contraseña a un usuario'
|
|
|
|
@click.command(context_settings=CONTEXT_SETTINGS)
|
|
@click.option('-bd', '--iniciar-bd',help=help_create_tables,
|
|
is_flag=True, default=False)
|
|
@click.option('-m', '--migrar-bd', help=help_migrate_db,
|
|
is_flag=True, default=False)
|
|
@click.option('-ns', '--nuevo-superusuario', help=help_superuser,
|
|
is_flag=True, default=False)
|
|
@click.option('-cc', '--cambiar-contraseña', help=help_change_pass,
|
|
is_flag=True, default=False)
|
|
def main(iniciar_bd, migrar_bd, nuevo_superusuario, cambiar_contraseña):
|
|
opt = locals()
|
|
|
|
if opt['iniciar_bd']:
|
|
create_tables()
|
|
sys.exit(0)
|
|
|
|
if opt['migrar_bd']:
|
|
migrate_tables()
|
|
sys.exit(0)
|
|
|
|
if opt['nuevo_superusuario']:
|
|
create_superuser()
|
|
sys.exit(0)
|
|
|
|
if opt['cambiar_contraseña']:
|
|
change_password()
|
|
return
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|