def upgrade(): op.add_column('payment', sa.Column('created_at', sa.DateTime())) op.add_column('payment', sa.Column('updated_at', sa.DateTime())) op.add_column('payment', sa.Column('bank_id', sa.Integer(), nullable=True)) op.add_column('payment', sa.Column('exported', sa.Boolean(), default=False)) op.add_column('payment', sa.Column( 'tva_id', sa.Integer(), sa.ForeignKey('tva.id'), nullable=True, )) op.add_column( 'payment', sa.Column('remittance_amount', sa.Integer(), nullable=True) ) op.add_column( 'tva', sa.Column('compte_a_payer', sa.String(125), default='') ) from autonomie_base.models.base import DBSESSION from autonomie.models.task import Payment session = DBSESSION() for payment in Payment.query(): payment.remittance_amount = payment.amount payment.exported = True payment.created_at = payment.updated_at = payment.date session.merge(payment)
def migrate_datas(): logger = logging.getLogger("alembic.autonomie") from autonomie_base.models.base import DBSESSION session = DBSESSION() from autonomie.models.config import Config import json from autonomie.models.files import ( File, FileType, ) json_str = Config.get_value("attached_filetypes", "[]") try: configured_filetypes = json.loads(json_str) except: logger.exception(u"Error in json str : %s" % json_str) configured_filetypes = [] if configured_filetypes: result = [] for filetype_label in configured_filetypes: if filetype_label: filetype = FileType(label=filetype_label) session.add(filetype) session.flush() result.append(filetype) for typ_ in result: query = File.query().filter_by(label=typ_.label) for file_ in query: file_.file_type_id = typ_.id session.merge(file_) session.flush()
def upgrade(): op.add_column('payment', sa.Column('created_at', sa.DateTime())) op.add_column('payment', sa.Column('updated_at', sa.DateTime())) op.add_column('payment', sa.Column('bank_id', sa.Integer(), nullable=True)) op.add_column('payment', sa.Column('exported', sa.Boolean(), default=False)) op.add_column( 'payment', sa.Column( 'tva_id', sa.Integer(), sa.ForeignKey('tva.id'), nullable=True, )) op.add_column('payment', sa.Column('remittance_amount', sa.Integer(), nullable=True)) op.add_column('tva', sa.Column('compte_a_payer', sa.String(125), default='')) from autonomie_base.models.base import DBSESSION from autonomie.models.task import Payment session = DBSESSION() for payment in Payment.query(): payment.remittance_amount = payment.amount payment.exported = True payment.created_at = payment.updated_at = payment.date session.merge(payment)
def assign_number(cls, invoice, template): """ This function should be run within an SQL transaction to enforce sequence index unicity. """ if invoice.official_number: raise ValueError('This invoice already have an official number') cls.validate_template(template) db = DBSESSION() formatter = InvoiceNumberFormatter(invoice, cls.SEQUENCES_MAP) invoice_number = formatter.format(template) involved_sequences = cls.get_involved_sequences(invoice, template) # Create SequenceNumber objects (the index useages have not been # booked until now). for sequence, next_index in involved_sequences: sn = SequenceNumber( sequence=sequence.db_key, index=next_index, task_id=invoice.id, ) db.add(sn) db.flush() invoice.official_number = invoice_number db.merge(invoice) return invoice_number
def resize_headers_command(arguments, env): """ Resize headers to limit their size :param dict arguments: The arguments parsed from the command-line :param obj env: The pyramid environment """ from sqlalchemy import distinct from autonomie.models.files import File from autonomie.models.company import Company from autonomie.forms.company import HEADER_RESIZER limit = get_value(arguments, 'limit', None) offset = get_value(arguments, "offset", None) session = DBSESSION() file_id_query = session.query(distinct(Company.header_id)) if limit: file_id_query = file_id_query.limit(limit) if offset: file_id_query = file_id_query.offset(offset) header_ids = [i[0] for i in file_id_query] header_files = File.query().filter(File.id.in_(header_ids)) for header_file in header_files: file_datas = header_file.data_obj if file_datas: print( u"Resizing header with id : {}".format( header_file.id ) ) header_file.data = HEADER_RESIZER.complete(file_datas) session.merge(header_file)
def migrate_datas(): from autonomie_base.models.base import DBSESSION session = DBSESSION() from autonomie.models.accounting.operations import AccountingOperationUpload for entry in AccountingOperationUpload.query(): entry.filetype = "analytical_balance" session.merge(entry) session.flush()
def migrate_datas(): from autonomie_base.models.base import DBSESSION session = DBSESSION() from autonomie.models.customer import Customer for customer in Customer.query().options( sa.orm.load_only("id", "name", "lastname", "firstname", "civilite", "type_")): customer.label = customer._get_label() session.merge(customer)
def migrate_datas(): from autonomie_base.models.base import DBSESSION session = DBSESSION() from alembic.context import get_bind connection = get_bind() from autonomie.models.user.login import Login op.execute("update groups set editable=0;") op.execute("update groups set `primary`=0;") op.execute( "update groups set `primary`=1 where name IN ('admin', 'contractor', 'manager')" ) op.execute('update accounts set civilite="Monsieur"') for user in connection.execute(user_helper.select()): login = Login( user_id=user.id, login=user.login, ) login.pwd_hash = user.password, login.active = user.active == 'Y' session.add(login) session.flush() op.execute( 'UPDATE user_groups set login_id="%s" where user_id=%s' % ( login.id, user.id ) ) op.drop_column("accounts", "login") op.drop_column("accounts", "password") op.drop_column("accounts", "active") from autonomie.models.user.user import User for userdatas in connection.execute(userdatas_helper.select()): if userdatas.user_id is None: user = User( lastname=userdatas.coordonnees_lastname, firstname=userdatas.coordonnees_firstname, email=userdatas.coordonnees_email1, civilite=userdatas.coordonnees_civilite or 'Monsieur', ) session.add(user) session.flush() connection.execute( userdatas_helper.update().where( userdatas_helper.c.id == userdatas.id ).values(user_id=user.id) ) else: user = User.get(userdatas.user_id) user.civilite = userdatas.coordonnees_civilite or 'Monsieur' session.merge(user) session.flush() op.execute('update accounts set civilite="Monsieur" where civilite is NULL')
def upgrade(): from autonomie.models.task import Invoice, CancelInvoice, ManualInvoice from autonomie_base.models.base import DBSESSION for table in "invoice", "cancelinvoice", "manualinv": if not column_exists(table, "financial_year"): op.add_column(table, sa.Column("financial_year", sa.Integer, nullable=False)) for type_ in (Invoice, CancelInvoice, ManualInvoice): for document in type_.query(): document.financial_year = document.taskDate.year DBSESSION.merge(document)
def upgrade(): from autonomie.models.task import Invoice, CancelInvoice, ManualInvoice from autonomie_base.models.base import DBSESSION for table in "invoice", "cancelinvoice", "manualinv": if not column_exists(table, "financial_year"): op.add_column( table, sa.Column("financial_year", sa.Integer, nullable=False)) for type_ in (Invoice, CancelInvoice, ManualInvoice): for document in type_.query(): document.financial_year = document.taskDate.year DBSESSION.merge(document)
def upgrade(): op.execute(u"Alter table tva modify name VARCHAR(15)") op.execute(u"Alter table tva modify active tinyint(1)") op.add_column('tva', sa.Column('mention', sa.Text(), default='')) from autonomie.models.tva import Tva from autonomie_base.models.base import DBSESSION session = DBSESSION() for tva in session.query(Tva): if tva.value <= 0: tva.mention = u"TVA non applicable selon l'article 259b du CGI." session.merge(tva) else: tva.mention = u"TVA {0} %".format(tva.value / 100.0) session.merge(tva)
def upgrade(): from autonomie.models.user import User logger = logging.getLogger("alembic.migrate_code_compta") op.add_column("company", sa.Column("code_compta", sa.String(30), default=0)) dbsession = DBSESSION() for user in User.query(): code_compta = user.code_compta companies = user.companies if code_compta not in [u"0", None, u""]: if len(companies) == 1: company = companies[0] company.code_compta = code_compta dbsession.merge(company) else: logger.warn(u"User {0} has a code_compta and multiple \ companies".format(user.id))
def upgrade(): logger = logging.getLogger("alembic.migrate_code_compta") op.add_column("company", sa.Column("code_compta", sa.String(30), default=0)) dbsession = DBSESSION() for user in User.query(): code_compta = user.code_compta companies = user.companies if code_compta not in [u"0", None, u""]: if len(companies) == 1: company = companies[0] company.code_compta = code_compta dbsession.merge(company) else: logger.warn(u"User {0} has a code_compta and multiple \ companies".format(user.id))
def assign_number(cls, invoice, template): """ This function should be run within an SQL transaction to enforce sequence index unicity. """ if invoice.official_number: raise ValueError('This invoice already have an official number') db = DBSESSION() formatter = InvoiceNumberFormatter(invoice, cls.SEQUENCES_MAP) invoice_number = formatter.format(template) involved_sequences = cls.get_involved_sequences(invoice, template) with db.begin_nested(): # Create SequenceNumber objects (the index useages have not been # booked until now). for sequence, next_index in involved_sequences: sn = SequenceNumber( sequence=sequence.db_key, index=next_index, task_id=invoice.id, ) db.add(sn) invoice.official_number = invoice_number db.merge(invoice) # Imported here to avoid circular dependencies from autonomie.models.task import Task, Invoice, CancelInvoice query = Task.query().with_polymorphic([Invoice, CancelInvoice]) query = query.filter( Task.official_number == invoice_number, Task.id != invoice.id, Task.legacy_number == False, ).scalar() if query is not None: # This case is exceptionnal, we can afford a crash here # Context manager will take care of rolling back # subtransaction. raise ValueError( 'Invoice number collision, rolling back to avoid it' ) return invoice_number
def upgrade(): from autonomie.models.client import Client for table in ("estimation", "invoice", "cancelinvoice"): op.add_column(table, sa.Column("address", sa.Text, default="")) op.add_column( table, sa.Column("client_id", sa.Integer, sa.ForeignKey("customer.id"))) for obj in (Invoice, CancelInvoice, Estimation): for doc in obj.query(): if doc.project is not None and doc.project.client_id is not None: client = Client.get(doc.project.client_id) if client is not None: doc.address = client.full_address doc.client_id = client.id if len(doc._number) > 10: doc._number = doc._number[10:] DBSESSION.merge(doc)
def upgrade(): from autonomie.models.company import Company from autonomie.models.files import File from autonomie_base.models.base import DBSESSION from alembic.context import get_bind from autonomie.models.config import ConfigFiles for i in ('header_id', 'logo_id',): col = sa.Column(i, sa.Integer, sa.ForeignKey('file.id')) op.add_column('company', col) query = "select id, header, logo from company;" conn = get_bind() result = conn.execute(query) session = DBSESSION() for id_, header, logo in result: company = Company.get(id_) basepath = u"%scompany/%s" % (BASEFILEPATH, id_,) if header: header_path = u"%s/header/%s" % (basepath, header) try: file_datas = load_file_struct(header_path, header) except: print("Error while loading a header") print(id_) file_datas = None if file_datas: company.header = file_datas session.add(company.header_file) session.flush() if logo: logo_path = u"%s/logo/%s" % (basepath, logo) try: file_datas = load_file_struct(logo_path, logo) except: print("Error while loading a logo") print(id_) file_datas = None if file_datas: company.logo = file_datas company = session.merge(company) session.flush() filepath = u"%s/main/logo.png" % BASEFILEPATH if os.path.isfile(filepath): ConfigFiles.set('logo.png', load_file_struct(filepath, 'logo.png')) filepath = u"%s/main/accompagnement_header.png" % BASEFILEPATH if os.path.isfile(filepath): ConfigFiles.set( 'accompagnement_header.png', load_file_struct(filepath, 'accompagnement_header.png') )
def upgrade(): from autonomie.models.client import Client for table in ("estimation", "invoice", "cancelinvoice"): op.add_column(table, sa.Column("address", sa.Text, default="")) op.add_column(table, sa.Column("client_id", sa.Integer, sa.ForeignKey("customer.id"))) for obj in (Invoice, CancelInvoice, Estimation): for doc in obj.query(): if doc.project is not None and doc.project.client_id is not None: client = Client.get(doc.project.client_id) if client is not None: doc.address = client.full_address doc.client_id = client.id if len(doc._number) > 10: doc._number = doc._number[10:] DBSESSION.merge(doc)
def set_validation_status(self, status): if status not in self.VALIDATION_STATUS: raise Exception("Invalid validation status") self.validation_status = status if status == "valid": self.status = "success" else: self.status = "warning" return DBSESSION.merge(self)
def upgrade(): disable_listeners() op.add_column('task', sa.Column('date', sa.Date())) from autonomie.models.task import Task from autonomie_base.models.base import DBSESSION session = DBSESSION() for task in Task.query().filter(Task.type_!='manualinvoice'): task.date = task.taskDate session.merge(task) session.flush() op.execute("alter table groups modify label VARCHAR(255);") op.execute("alter table payment modify remittance_amount VARCHAR(255);") from autonomie.models.user import User, Group for group_id, group_name, group_label in GROUPS: group = session.query(Group).filter(Group.name==group_name).first() if group is None: group = Group(name=group_name, label=group_label) session.add(group) session.flush() users = session.query(User).filter(User.primary_group==group_id) for user in users: user._groups.append(group) session.merge(user) label = u"Peut saisir/modifier/supprimer les paiements de ses factures" group_name = "payment_admin" group = Group.query().filter(Group.name==group_name).first() if group is not None: group.label = label session.merge(group)
def upgrade(): disable_listeners() op.add_column('task', sa.Column('date', sa.Date())) from autonomie.models.task import Task from autonomie_base.models.base import DBSESSION session = DBSESSION() for task in Task.query().filter(Task.type_ != 'manualinvoice'): task.date = task.taskDate session.merge(task) session.flush() op.execute("alter table groups modify label VARCHAR(255);") op.execute("alter table payment modify remittance_amount VARCHAR(255);") from autonomie.models.user import User, Group for group_id, group_name, group_label in GROUPS: group = session.query(Group).filter(Group.name == group_name).first() if group is None: group = Group(name=group_name, label=group_label) session.add(group) session.flush() users = session.query(User).filter(User.primary_group == group_id) for user in users: user._groups.append(group) session.merge(user) label = u"Peut saisir/modifier/supprimer les paiements de ses factures" group_name = "payment_admin" group = Group.query().filter(Group.name == group_name).first() if group is not None: group.label = label session.merge(group)
def upgrade(): from autonomie.models.task import ( TaskLine, TaskLineGroup, Task, Estimation, CancelInvoice, Invoice, ) from autonomie_base.models.base import ( DBSESSION, ) session = DBSESSION() index = 0 query = Task.query() query = query.with_polymorphic([Invoice, CancelInvoice, Estimation]) query = query.filter( Task.type_.in_(['invoice', 'estimation', 'cancelinvoice']) ) for task in query: try: task_lines = task.default_line_group.lines except: continue for index, line in enumerate(task.lines): try: task_line = task_lines[index] task_line.unity = line.unity session.merge(task_line) except: pass index += 1 if index % 100 == 0: session.flush()
def upgrade(): # Ajout et modification de la structure de données existantes op.execute("alter table project modify archived BOOLEAN;") for name in ('ht', 'tva', 'ttc'): col = sa.Column(name, sa.Integer, default=0) op.add_column('task', col) for col in ( sa.Column("project_id", sa.Integer, sa.ForeignKey('project.id')), sa.Column("customer_id", sa.Integer, sa.ForeignKey('customer.id')), sa.Column("_number", sa.String(10)), sa.Column("sequence_number", sa.Integer), sa.Column("display_units", sa.Integer, default=0), sa.Column('expenses', sa.Integer, default=0), sa.Column('expenses_ht', sa.Integer, default=0), sa.Column('address', sa.Text, default=""), sa.Column('payment_conditions', sa.Text, default=""), sa.Column("official_number", sa.Integer, default=None), ): op.add_column("task", col) col = sa.Column("sortie_type_id", sa.Integer, sa.ForeignKey('type_sortie_option.id')) op.add_column("user_datas", col) op.execute("alter table user_datas modify parcours_num_hours float DEFAULT NULL") op.execute("alter table external_activity_datas modify hours float DEFAULT NULL") op.execute("alter table external_activity_datas modify brut_salary float DEFAULT NULL") col = sa.Column("cgv", sa.Text, default="") op.add_column("company", col) col = sa.Column('_acl', sa.Text) op.add_column("job", col) # Migration des donnees vers la nouvelle structure from alembic.context import get_bind conn = get_bind() from autonomie_base.models.base import DBSESSION session = DBSESSION() # Expenses will be nodes make_expense_nodes(conn, session) from autonomie.models.task import ( Invoice, CancelInvoice, Estimation, ) # Migration des customer_id et project_id au niveau de la table Task index = 0 for type_ in "invoice", "cancelinvoice", "estimation": conditions = "paymentConditions" if type_ == "cancelinvoice": conditions = "reimbursementConditions" request = "select id, customer_id, project_id, number, \ sequenceNumber, displayedUnits, expenses, expenses_ht, address, %s \ from %s;" % (conditions, type_) result = conn.execute(request) for index, (id, c_id, p_id, number, seq_number, display, expenses, expenses_ht, address, conditions) in enumerate(result): request = sa.text(u"update task set \ project_id=:p_id, \ customer_id=:c_id, \ _number=:number, \ sequence_number=:seq_number, \ display_units=:display, \ expenses=:expenses, \ expenses_ht=:expenses_ht, \ address=:address, \ payment_conditions=:conditions \ where id=:id;" ) conn.execute( request, p_id=p_id, c_id=c_id, number=number, seq_number=seq_number, display=display, expenses=expenses, expenses_ht=expenses_ht, address=address, conditions=conditions, id=id, ) if index % 50 == 0: session.flush() for type_ in ('invoice', 'cancelinvoice'): request = "select id, officialNumber from %s" % (type_,) result = conn.execute(request) for index, (id, official_number) in enumerate(result): request = sa.text(u"update task set \ official_number=:official_number \ where id=:id;" ) conn.execute( request, official_number=official_number, id=id, ) if index % 50 == 0: session.flush() for factory in (Invoice, CancelInvoice, Estimation,): for document in factory.query().options(undefer_group('edit')): document.ttc = document.total() document.ht = document.total_ht() document.tva = document.tva_amount() session.merge(document) index += 1 if index % 50 == 0: session.flush() # Drop old constraints for table in ('estimation', 'invoice', 'cancelinvoice'): for num in [2,3,4]: key = "%s_ibfk_%s" % (table, num,) cmd = "ALTER TABLE %s DROP FOREIGN KEY %s;" % (table, key) try: print(cmd) conn.execute(cmd) except: print("Error while droping a foreignkey : %s %s" % (table, key)) for column in ('customer_id', 'project_id', 'number', \ 'sequenceNumber', 'displayedUnits', 'expenses', \ 'expenses_ht', 'address'): op.drop_column(table, column) op.drop_column('cancelinvoice', 'reimbursementConditions') op.drop_column('estimation', 'paymentConditions') op.drop_column('invoice', 'paymentConditions') for table in ('invoice', 'cancelinvoice'): op.drop_column(table, 'officialNumber')
def upgrade(): # Ajout et modification de la structure de données existantes op.execute("alter table project modify archived BOOLEAN;") for name in ('ht', 'tva', 'ttc'): col = sa.Column(name, sa.Integer, default=0) op.add_column('task', col) for col in ( sa.Column("project_id", sa.Integer, sa.ForeignKey('project.id')), sa.Column("customer_id", sa.Integer, sa.ForeignKey('customer.id')), sa.Column("_number", sa.String(10)), sa.Column("sequence_number", sa.Integer), sa.Column("display_units", sa.Integer, default=0), sa.Column('expenses', sa.Integer, default=0), sa.Column('expenses_ht', sa.Integer, default=0), sa.Column('address', sa.Text, default=""), sa.Column('payment_conditions', sa.Text, default=""), sa.Column("official_number", sa.Integer, default=None), ): op.add_column("task", col) col = sa.Column("sortie_type_id", sa.Integer, sa.ForeignKey('type_sortie_option.id')) op.add_column("user_datas", col) op.execute( "alter table user_datas modify parcours_num_hours float DEFAULT NULL") op.execute( "alter table external_activity_datas modify hours float DEFAULT NULL") op.execute( "alter table external_activity_datas modify brut_salary float DEFAULT NULL" ) col = sa.Column("cgv", sa.Text, default="") op.add_column("company", col) col = sa.Column('_acl', sa.Text) op.add_column("job", col) # Migration des donnees vers la nouvelle structure from alembic.context import get_bind conn = get_bind() from autonomie_base.models.base import DBSESSION session = DBSESSION() # Expenses will be nodes make_expense_nodes(conn, session) from autonomie.models.task import ( Invoice, CancelInvoice, Estimation, ) # Migration des customer_id et project_id au niveau de la table Task index = 0 for type_ in "invoice", "cancelinvoice", "estimation": conditions = "paymentConditions" if type_ == "cancelinvoice": conditions = "reimbursementConditions" request = "select id, customer_id, project_id, number, \ sequenceNumber, displayedUnits, expenses, expenses_ht, address, %s \ from %s;" % (conditions, type_) result = conn.execute(request) for index, (id, c_id, p_id, number, seq_number, display, expenses, expenses_ht, address, conditions) in enumerate(result): request = sa.text(u"update task set \ project_id=:p_id, \ customer_id=:c_id, \ _number=:number, \ sequence_number=:seq_number, \ display_units=:display, \ expenses=:expenses, \ expenses_ht=:expenses_ht, \ address=:address, \ payment_conditions=:conditions \ where id=:id;") conn.execute( request, p_id=p_id, c_id=c_id, number=number, seq_number=seq_number, display=display, expenses=expenses, expenses_ht=expenses_ht, address=address, conditions=conditions, id=id, ) if index % 50 == 0: session.flush() for type_ in ('invoice', 'cancelinvoice'): request = "select id, officialNumber from %s" % (type_, ) result = conn.execute(request) for index, (id, official_number) in enumerate(result): request = sa.text(u"update task set \ official_number=:official_number \ where id=:id;") conn.execute( request, official_number=official_number, id=id, ) if index % 50 == 0: session.flush() for factory in ( Invoice, CancelInvoice, Estimation, ): for document in factory.query().options(undefer_group('edit')): document.ttc = document.total() document.ht = document.total_ht() document.tva = document.tva_amount() session.merge(document) index += 1 if index % 50 == 0: session.flush() # Drop old constraints for table in ('estimation', 'invoice', 'cancelinvoice'): for num in [2, 3, 4]: key = "%s_ibfk_%s" % ( table, num, ) cmd = "ALTER TABLE %s DROP FOREIGN KEY %s;" % (table, key) try: print(cmd) conn.execute(cmd) except: print("Error while droping a foreignkey : %s %s" % (table, key)) for column in ('customer_id', 'project_id', 'number', \ 'sequenceNumber', 'displayedUnits', 'expenses', \ 'expenses_ht', 'address'): op.drop_column(table, column) op.drop_column('cancelinvoice', 'reimbursementConditions') op.drop_column('estimation', 'paymentConditions') op.drop_column('invoice', 'paymentConditions') for table in ('invoice', 'cancelinvoice'): op.drop_column(table, 'officialNumber')
class Anonymizer(object): def __init__(self, logger): self.us_faker = Faker() self.faker = Faker('fr_FR') self.logger = logger self.session = DBSESSION() def _zipcode(self): if hasattr(self.faker, 'zipcode'): return self.faker.zipcode() else: return self.faker.postcode() def _an_activity(self): from autonomie.models.activity import Activity, ActivityType for activity in self.session.query(Activity): for fieldname in ('point', 'objectifs', 'action', 'documents', 'notes'): setattr(activity, fieldname, self.faker.text()) type_labels = ( u"RV conseil", u"RV suivi", u"RV Gestion", u"RV Admin", u"RV RH", u"RV Compta", u"RV hebdo", u"RV Mensuel", ) for index, typ in enumerate(self.session.query(ActivityType).all()): typ.label = type_labels[index % 7] def _an_commercial(self): from autonomie.models.commercial import TurnoverProjection for t in self.session.query(TurnoverProjection): t.comment = self.faker.text() def _an_company(self): from autonomie.models.company import Company for comp in self.session.query(Company): comp.name = self.faker.company() comp.goal = self.faker.bs() comp.comments = self.faker.catch_phrase() comp.phone = self.faker.phone_number() comp.mobile = self.faker.phone_number() comp.email = self.faker.ascii_safe_email() header = build_header(u"{0}\n {1} - {2}".format( comp.name, comp.phone, comp.email)) comp.header = {'name': 'header.png', 'data': header} self.session.execute(u"update company set cgv=''") def _an_competence(self): from autonomie.models.competence import ( CompetenceGridItem, CompetenceGridSubItem, ) for item in self.session.query(CompetenceGridItem): item.progress = self.faker.text() for item in self.session.query(CompetenceGridSubItem): item.comments = self.faker.text() def _an_config(self): from autonomie.models.config import Config, ConfigFiles Config.set('cae_admin_mail', self.faker.ascii_safe_email()) Config.set('welcome', self.faker.sentence(nb_words=15)) ConfigFiles.set( 'logo.png', { 'data': pkg_resources.resource_stream('autonomie', 'static/img/autonomie.jpg'), 'filename': 'logo.jpg', }) Config.set('coop_cgv', self.faker.paragraph(nb_sentences=40)) Config.set( 'coop_pdffootertitle', u"""Une activité de ma CAE SARL SCOP à \ capital variable""") Config.set( 'coop_pdffootercourse', u"""Organisme de formation N° de déclaration \ d'activité au titre de la FPC : xx xx xxxxx. MA CAE est exonérée de TVA pour \ les activités s'inscrivant dans le cadre de la formation professionnelle \ conformément à l'art. L920-4 du Code du travail et de l'art. 202 C de \ l'annexe II du code général des impôts""") footer = u"""RCS XXXX 000 000 000 00000 - SIRET 000 \ 000 000 000 00 - Code naf 0000Z TVA INTRACOM : FR0000000. Siège social : 10 \ rue vieille 23200 Aubusson""" Config.set('coop_pdffootercontent', footer) Config.set('coop_pdffootertext', footer) Config.set( 'coop_invoicepayment', u"""Par chèque libellé à l'ordre de : \ MA CAE/ %ENTREPRENEUR% à envoyer à l'adresse suivante : MA CAE/ %ENTREPRENEUR% 10 rue Vieille 23200 Aubusson Ou par virement sur le compte de MA CAE/ %ENTREPRENEUR% MA BANQUE RIB : xxxxx xxxx xxxxxxxxxxxxx IBAN : xxxx xxxx xxxx xxxx xxxx xxxx xxx BIC : MABAFRMACAXX Merci d'indiquer le numéro de facture sur le libellé de votre virement ou \ dos de votre chèque. """) Config.set( "coop_invoicelate", u"""Tout retard de paiement entraînera à titre de \ clause pénale, conformément à la loi 92.1442 du 31 décembre 1992, une \ pénalité égale à un taux d'intérêt équivalent à une fois et demi le taux \ d'intérêt légal en vigueur à cette échéance. Une indemnité de 40 euros forfaitaire sera demandée en sus pour chaque \ facture payée après l’échéance fixée. Celle-ci n’est pas soumise à TVA.""") Config.set("activity_footer", footer) Config.set('workshop_footer', footer) def _an_customer(self): from autonomie.models.customer import Customer for cust in self.session.query(Customer): cust.name = self.faker.company() cust.address = self.faker.street_address() cust.zipcode = self._zipcode() cust.city = self.faker.city() cust.lastname = self.faker.last_name() cust.firstname = self.faker.first_name() cust.email = self.faker.ascii_safe_email() cust.phone = self.faker.phone_number() cust.fax = self.faker.phone_number() cust.tva_intracomm = "" cust.comments = self.faker.bs() def _an_expense(self): from autonomie.models.expense.sheet import ( BaseExpenseLine, ExpenseKmLine, Communication, ) for line in self.session.query(BaseExpenseLine): line.description = self.faker.text() for line in self.session.query(ExpenseKmLine): line.start = self.faker.city() line.end = self.faker.city() for com in self.session.query(Communication): com.content = self.faker.text() def _an_node(self): from autonomie.models.node import Node for node in self.session.query(Node): node.name = self.faker.sentence(nb_words=4, variable_nb_words=True) def _an_payment(self): from autonomie.models.payments import BankAccount for b in self.session.query(BankAccount): b.label = u"Banque : {0}".format(self.faker.company()) def _an_project(self): from autonomie.models.project import Project, Phase for p in self.session.query(Project): p.name = self.faker.sentence(nb_words=5) p.definition = self.faker.text() for p in self.session.query(Phase): if p.name != u"Phase par défaut": p.name = self.faker.sentence(nb_words=3) def _an_sale_product(self): from autonomie.models.sale_product import ( SaleProductCategory, SaleProduct, SaleProductGroup, ) for cat in self.session.query(SaleProductCategory): cat.title = self.faker.sentence(nb_words=3) cat.description = self.faker.text() for prod in self.session.query(SaleProduct): prod.label = self.faker.sentence(nb_words=2) prod.description = self.faker.text() for group in self.session.query(SaleProductGroup): group.title = self.faker.sentence(nb_words=2) group.description = self.faker.text() def _an_statistic(self): from autonomie.models.statistics import (StatisticSheet) for s in self.session.query(StatisticSheet): s.title = self.faker.sentence(nb_words=4) def _an_task(self): from autonomie.models.task import ( Task, DiscountLine, TaskLine, TaskLineGroup, Estimation, TaskStatus, ) for task in self.session.query(Task): if task.status_comment: task.status_comment = self.faker.text() task.description = self.faker.text() task.address = task.customer.full_address task.workplace = self.faker.address() task.payment_conditions = u"Par chèque ou virement à réception de " u"facture" for line in self.session.query(DiscountLine): line.description = self.faker.text() for line in self.session.query(TaskLine): line.description = self.faker.text() for group in self.session.query(TaskLineGroup): if group.title: group.title = self.faker.sentence(nb_words=4) if group.description: group.description = self.faker.text() for status in self.session.query(TaskStatus): status.status_comment = self.faker.sentence(nb_words=6) for estimation in self.session.query(Estimation): if estimation.exclusions: estimation.exclusions = self.faker.text() def _an_task_config(self): from autonomie.models.task import ( PaymentConditions, ) for i in self.session.query(PaymentConditions): self.session.delete(i) for index, label in enumerate( [u"30 jours fin de mois", u"À réception de facture"]): condition = PaymentConditions(label=label) if index == 0: condition.default = True self.session.add(condition) def _an_user(self): from autonomie.models.user.login import ( Login, ) from autonomie.models.user.user import ( User, ) self.session.execute("Update accounts set session_datas='{}'") counter = itertools.count() found_contractor = False for u in self.session.query(Login).join(User).filter( Login.active == True): index = counter.next() if index == 1: u.login = u"admin1" u.groups = ['admin'] elif index == 2: u.login = u"manager1" u.groups = ["manager"] elif not found_contractor and "contractor" in u.groups: u.login = u"entrepreneur1" found_contractor = True else: u.login = u"user_{0}".format(index) u.user.lastname = self.faker.last_name() u.user.firstname = self.faker.first_name() u.user.email = self.faker.ascii_safe_email() u.set_password(u.login) if u.user.has_userdatas(): u.user.userdatas.coordonnees_lastname = u.user.lastname u.user.userdatas.coordonnees_firstname = u.user.firstname u.user.userdatas.coordonnees_email1 = u.user.email for u in self.session.query(Login).join(User).filter( Login.active == False): index = counter.next() u.login = u"user_{0}".format(index) u.user.lastname = self.faker.last_name() u.user.firstname = self.faker.first_name() u.user.email = self.faker.ascii_safe_email() u.set_password(u.login) if u.user.has_userdatas(): u.user.userdatas.coordonnees_lastname = u.user.lastname u.user.userdatas.coordonnees_firstname = u.user.firstname u.user.userdatas.coordonnees_email1 = u.user.email def _an_userdatas(self): from autonomie.models.user.userdatas import ( UserDatas, CompanyDatas, AntenneOption, ) for u in self.session.query(UserDatas): if u.user_id is None: u.coordonnees_lastname = self.faker.last_name() u.coordonnees_firstname = self.faker.first_name() u.coordonnees_email1 = self.faker.ascii_safe_email() u.coordonnees_ladies_lastname = self.faker.last_name_female() u.coordonnees_email2 = self.faker.ascii_safe_email() u.coordonnees_tel = self.faker.phone_number()[:14] u.coordonnees_mobile = self.faker.phone_number()[:14] u.coordonnees_address = self.faker.street_address() u.coordonnees_zipcode = self._zipcode() u.coordonnees_city = self.faker.city() u.coordonnees_birthplace = self.faker.city() u.coordonnees_birthplace_zipcode = self._zipcode() u.coordonnees_secu = u"0 00 00 000 000 00" u.coordonnees_emergency_name = self.faker.name() u.coordonnees_emergency_phone = self.faker.phone_number()[:14] u.parcours_goals = self.faker.text() for datas in self.session.query(CompanyDatas): datas.title = self.faker.company() datas.name = self.faker.company() datas.website = self.faker.url() for a in AntenneOption.query(): a.label = u"Antenne : {0}".format(self.faker.city()) def _an_files(self): from autonomie.models.files import File for file_ in self.session.query(File): self.session.delete(file_) from autonomie.models.files import Template sample_tmpl_path = os.path.abspath( pkg_resources.resource_filename('autonomie', 'sample_templates')) for filename in os.listdir(sample_tmpl_path): filepath = os.path.join(sample_tmpl_path, filename) with open(filepath, 'r') as fbuf: tmpl = Template(name=filename, description=filename) tmpl.data = fbuf.read() self.session.add(tmpl) def _an_celery_jobs(self): self.session.execute("delete from mailing_job") self.session.execute("delete from file_generation_job") self.session.execute("delete from csv_import_job") self.session.execute("delete from job") def _an_task_mentions(self): from autonomie.models.task.mentions import TaskMention for mention in TaskMention.query(): mention.full_text = self.faker.paragraph(nb_sentences=3) self.session.merge(mention) def run(self, module_key=None): if module_key is not None: if not module_key.startswith('_an_'): module_key = u"_an_%s" % module_key keys = [module_key] methods = {module_key: getattr(self, module_key)} else: methods = {} for method_name, method in inspect.getmembers( self, inspect.ismethod): if method_name.startswith('_an_'): methods[method_name] = method keys = methods.keys() keys.sort() for key in keys: self.logger.debug(u"Step : {0}".format(key)) methods[key]() transaction.commit() transaction.begin()
class Anonymizer(object): def __init__(self, logger): self.us_faker = Faker() self.faker = Faker('fr_FR') self.logger = logger self.session = DBSESSION() def _zipcode(self): if hasattr(self.faker, 'zipcode'): return self.faker.zipcode() else: return self.faker.postcode() def _an_activity(self): from autonomie.models.activity import Activity, ActivityType from autonomie.models.workshop import Workshop for activity in self.session.query(Activity): for fieldname in ( 'point', 'objectifs', 'action', 'documents', 'notes' ): setattr(activity, fieldname, self.faker.text()) for workshop in self.session.query(Workshop).options(load_only('id')): workshop.description = self.faker.text() self.session.merge(workshop) type_labels = ( u"RV conseil", u"RV suivi", u"RV Gestion", u"RV Admin", u"RV RH", u"RV Compta", u"RV hebdo", u"RV Mensuel", ) for index, typ in enumerate(self.session.query(ActivityType).all()): typ.label = type_labels[index % 7] def _an_commercial(self): from autonomie.models.commercial import TurnoverProjection for t in self.session.query(TurnoverProjection): t.comment = self.faker.text() def _an_company(self): from autonomie.models.company import Company for comp in self.session.query(Company): comp.name = self.faker.company() comp.goal = self.faker.bs() comp.comments = self.faker.catch_phrase() comp.phone = self.faker.phone_number() comp.mobile = self.faker.phone_number() comp.email = self.faker.ascii_safe_email() header = build_header( u"{0}\n {1} - {2}".format(comp.name, comp.phone, comp.email) ) comp.header = {'name': 'header.png', 'data': header} self.session.execute(u"update company set cgv=''") def _an_competence(self): from autonomie.models.competence import ( CompetenceGridItem, CompetenceGridSubItem, ) for item in self.session.query(CompetenceGridItem): item.progress = self.faker.text() for item in self.session.query(CompetenceGridSubItem): item.comments = self.faker.text() def _an_config(self): from autonomie.models.config import Config, ConfigFiles Config.set('cae_admin_mail', self.faker.ascii_safe_email()) Config.set('welcome', self.faker.sentence(nb_words=15)) ConfigFiles.set( 'logo.png', { 'data': pkg_resources.resource_stream( 'autonomie', 'static/img/autonomie.jpg' ), 'filename': 'logo.jpg', } ) Config.set('coop_cgv', self.faker.paragraph(nb_sentences=40)) Config.set('coop_pdffootertitle', u"""Une activité de ma CAE SARL SCOP à \ capital variable""") Config.set('coop_pdffootercourse', u"""Organisme de formation N° de déclaration \ d'activité au titre de la FPC : xx xx xxxxx. MA CAE est exonérée de TVA pour \ les activités s'inscrivant dans le cadre de la formation professionnelle \ conformément à l'art. L920-4 du Code du travail et de l'art. 202 C de \ l'annexe II du code général des impôts""") footer = u"""RCS XXXX 000 000 000 00000 - SIRET 000 \ 000 000 000 00 - Code naf 0000Z TVA INTRACOM : FR0000000. Siège social : 10 \ rue vieille 23200 Aubusson""" Config.set('coop_pdffootercontent', footer) Config.set('coop_pdffootertext', footer) Config.set('coop_invoicepayment', u"""Par chèque libellé à l'ordre de : \ MA CAE/ %ENTREPRENEUR% à envoyer à l'adresse suivante : MA CAE/ %ENTREPRENEUR% 10 rue Vieille 23200 Aubusson Ou par virement sur le compte de MA CAE/ %ENTREPRENEUR% MA BANQUE RIB : xxxxx xxxx xxxxxxxxxxxxx IBAN : xxxx xxxx xxxx xxxx xxxx xxxx xxx BIC : MABAFRMACAXX Merci d'indiquer le numéro de facture sur le libellé de votre virement ou \ dos de votre chèque. """) Config.set("coop_invoicelate", u"""Tout retard de paiement entraînera à titre de \ clause pénale, conformément à la loi 92.1442 du 31 décembre 1992, une \ pénalité égale à un taux d'intérêt équivalent à une fois et demi le taux \ d'intérêt légal en vigueur à cette échéance. Une indemnité de 40 euros forfaitaire sera demandée en sus pour chaque \ facture payée après l’échéance fixée. Celle-ci n’est pas soumise à TVA.""") Config.set("activity_footer", footer) Config.set('workshop_footer', footer) def _an_customer(self): from autonomie.models.customer import Customer for cust in self.session.query(Customer): cust.name = self.faker.company() cust.address = self.faker.street_address() cust.zipcode = self._zipcode() cust.city = self.faker.city() cust.lastname = self.faker.last_name() cust.firstname = self.faker.first_name() cust.email = self.faker.ascii_safe_email() cust.phone = self.faker.phone_number() cust.fax = self.faker.phone_number() cust.tva_intracomm = "" cust.comments = self.faker.bs() def _an_expense(self): from autonomie.models.expense.sheet import ( BaseExpenseLine, ExpenseKmLine, Communication, ) for line in self.session.query(BaseExpenseLine): line.description = self.faker.text() for line in self.session.query(ExpenseKmLine): line.start = self.faker.city() line.end = self.faker.city() for com in self.session.query(Communication): com.content = self.faker.text() def _an_node(self): from autonomie.models.node import Node for node in self.session.query(Node): node.name = self.faker.sentence(nb_words=4, variable_nb_words=True) def _an_payment(self): from autonomie.models.payments import BankAccount for b in self.session.query(BankAccount): b.label = u"Banque : {0}".format(self.faker.company()) def _an_project(self): from autonomie.models.project import Project, Phase for p in self.session.query(Project): p.name = self.faker.sentence(nb_words=5) p.definition = self.faker.text() for p in self.session.query(Phase): if not p.name.is_default(): p.name = self.faker.sentence(nb_words=3) def _an_sale_product(self): from autonomie.models.sale_product import ( SaleProductCategory, SaleProduct, SaleProductGroup, ) for cat in self.session.query(SaleProductCategory): cat.title = self.faker.sentence(nb_words=3) cat.description = self.faker.text() for prod in self.session.query(SaleProduct): prod.label = self.faker.sentence(nb_words=2) prod.description = self.faker.text() for group in self.session.query(SaleProductGroup): group.title = self.faker.sentence(nb_words=2) group.description = self.faker.text() def _an_statistic(self): from autonomie.models.statistics import ( StatisticSheet ) for s in self.session.query(StatisticSheet): s.title = self.faker.sentence(nb_words=4) def _an_task(self): from autonomie.models.task import ( Task, DiscountLine, TaskLine, TaskLineGroup, Estimation, TaskStatus, ) for task in self.session.query(Task): if task.status_comment: task.status_comment = self.faker.text() task.description = self.faker.text() task.address = task.customer.full_address task.workplace = self.faker.address() task.payment_conditions = u"Par chèque ou virement à réception de " u"facture" if task.notes: task.notes = self.faker.text() for line in self.session.query(DiscountLine): line.description = self.faker.text() for line in self.session.query(TaskLine): line.description = self.faker.text() for group in self.session.query(TaskLineGroup): if group.title: group.title = self.faker.sentence(nb_words=4) if group.description: group.description = self.faker.text() for status in self.session.query(TaskStatus): status.status_comment = self.faker.sentence(nb_words=6) def _an_task_config(self): from autonomie.models.task import ( PaymentConditions, ) for i in self.session.query(PaymentConditions): self.session.delete(i) for index, label in enumerate( [u"30 jours fin de mois", u"À réception de facture"] ): condition = PaymentConditions(label=label) if index == 0: condition.default = True self.session.add(condition) def _an_user(self): from autonomie.models.user.login import ( Login, ) from autonomie.models.user.user import ( User, ) self.session.execute("Update accounts set session_datas='{}'") counter = itertools.count() found_contractor = False for u in self.session.query(Login).join(User).filter(Login.active==True): index = counter.next() if index == 1: u.login = u"admin1" u.groups = ['admin'] elif index == 2: u.login = u"manager1" u.groups = ["manager"] elif not found_contractor and "contractor" in u.groups: u.login = u"entrepreneur1" found_contractor = True else: u.login = u"user_{0}".format(index) u.user.lastname = self.faker.last_name() u.user.firstname = self.faker.first_name() u.user.email = self.faker.ascii_safe_email() u.set_password(u.login) if u.user.has_userdatas(): u.user.userdatas.coordonnees_lastname = u.user.lastname u.user.userdatas.coordonnees_firstname = u.user.firstname u.user.userdatas.coordonnees_email1 = u.user.email for u in self.session.query(Login).join(User).filter(Login.active==False ): index = counter.next() u.login = u"user_{0}".format(index) u.user.lastname = self.faker.last_name() u.user.firstname = self.faker.first_name() u.user.email = self.faker.ascii_safe_email() u.set_password(u.login) if u.user.has_userdatas(): u.user.userdatas.coordonnees_lastname = u.user.lastname u.user.userdatas.coordonnees_firstname = u.user.firstname u.user.userdatas.coordonnees_email1 = u.user.email def _an_userdatas(self): from autonomie.models.user.userdatas import ( UserDatas, CompanyDatas, AntenneOption, ) for u in self.session.query(UserDatas): if u.user_id is None: u.coordonnees_lastname = self.faker.last_name() u.coordonnees_firstname = self.faker.first_name() u.coordonnees_email1 = self.faker.ascii_safe_email() u.coordonnees_ladies_lastname = self.faker.last_name_female() u.coordonnees_email2 = self.faker.ascii_safe_email() u.coordonnees_tel = self.faker.phone_number()[:14] u.coordonnees_mobile = self.faker.phone_number()[:14] u.coordonnees_address = self.faker.street_address() u.coordonnees_zipcode = self._zipcode() u.coordonnees_city = self.faker.city() u.coordonnees_birthplace = self.faker.city() u.coordonnees_birthplace_zipcode = self._zipcode() u.coordonnees_secu = u"0 00 00 000 000 00" u.coordonnees_emergency_name = self.faker.name() u.coordonnees_emergency_phone = self.faker.phone_number()[:14] u.parcours_goals = self.faker.text() for datas in self.session.query(CompanyDatas): datas.title = self.faker.company() datas.name = self.faker.company() datas.website = self.faker.url() for a in AntenneOption.query(): a.label = u"Antenne : {0}".format(self.faker.city()) def _an_files(self): from autonomie.models.files import File for file_ in self.session.query(File): self.session.delete(file_) from autonomie.models.files import Template sample_tmpl_path = os.path.abspath( pkg_resources.resource_filename('autonomie', 'sample_templates') ) for filename in os.listdir(sample_tmpl_path): filepath = os.path.join(sample_tmpl_path, filename) with open(filepath, 'r') as fbuf: tmpl = Template(name=filename, description=filename) tmpl.data = fbuf.read() self.session.add(tmpl) def _an_celery_jobs(self): self.session.execute("delete from mailing_job") self.session.execute("delete from file_generation_job") self.session.execute("delete from csv_import_job") self.session.execute("delete from job") def _an_task_mentions(self): from autonomie.models.task.mentions import TaskMention for mention in TaskMention.query(): mention.full_text = self.faker.paragraph(nb_sentences=3) self.session.merge(mention) def run(self, module_key=None): if module_key is not None: if not module_key.startswith('_an_'): module_key = u"_an_%s" % module_key keys = [module_key] methods = {module_key: getattr(self, module_key)} else: methods = {} for method_name, method in inspect.getmembers( self, inspect.ismethod ): if method_name.startswith('_an_'): methods[method_name] = method keys = methods.keys() keys.sort() for key in keys: self.logger.debug(u"Step : {0}".format(key)) methods[key]() transaction.commit() transaction.begin()