def test_deposit_created_when_another_type_already_exist_for_user(self): birth_date = datetime.combine(datetime.utcnow(), time( 0, 0)) - relativedelta(years=18, months=4) with freeze_time(datetime.utcnow() - relativedelta(years=3)): beneficiary = users_factories.UnderageBeneficiaryFactory( dateOfBirth=birth_date) api.create_deposit(beneficiary, "created by test") assert beneficiary.deposit.type == DepositType.GRANT_18 assert len(beneficiary.deposits) == 2
def save_users_with_deposits(): user1 = users_factories.BeneficiaryGrant18Factory(email="*****@*****.**") user2 = users_factories.BeneficiaryGrant18Factory(email="*****@*****.**") user3 = users_factories.BeneficiaryGrant18Factory(email="*****@*****.**") user4 = users_factories.BeneficiaryGrant18Factory(email="*****@*****.**") user5 = users_factories.BeneficiaryGrant18Factory(email="*****@*****.**") deposit1 = payments_api.create_deposit(user1, "sandbox") deposit2 = payments_api.create_deposit(user2, "sandbox") deposit3 = payments_api.create_deposit(user3, "sandbox") deposit4 = payments_api.create_deposit(user4, "sandbox") deposit5 = payments_api.create_deposit(user5, "sandbox") repository.save(deposit1, deposit2, deposit3, deposit4, deposit5) logger.info("created 5 users with deposits") return user1, user2, user3, user4, user5
def to_model(beneficiary_pre_subscription: BeneficiaryPreSubscription) -> User: beneficiary = User() beneficiary.activity = beneficiary_pre_subscription.activity beneficiary.address = beneficiary_pre_subscription.address beneficiary.city = beneficiary_pre_subscription.city beneficiary.civility = beneficiary_pre_subscription.civility beneficiary.dateOfBirth = beneficiary_pre_subscription.date_of_birth beneficiary.departementCode = beneficiary_pre_subscription.department_code beneficiary.email = beneficiary_pre_subscription.email beneficiary.firstName = beneficiary_pre_subscription.first_name beneficiary.hasSeenTutorials = False beneficiary.isAdmin = False beneficiary.lastName = beneficiary_pre_subscription.last_name beneficiary.password = random_password() beneficiary.phoneNumber = beneficiary_pre_subscription.phone_number beneficiary.postalCode = beneficiary_pre_subscription.postal_code beneficiary.publicName = beneficiary_pre_subscription.public_name beneficiary.isBeneficiary = True generate_reset_token(beneficiary, validity_duration_hours=THIRTY_DAYS_IN_HOURS) deposit = payments_api.create_deposit( beneficiary, beneficiary_pre_subscription.deposit_source) beneficiary.deposits = [deposit] users_api.attach_beneficiary_import_details(beneficiary, beneficiary_pre_subscription) return beneficiary
def signup_webapp(): objects_to_save = [] check_valid_signup_webapp(request) new_user = User(from_dict=request.json) new_user.email = sanitize_email(new_user.email) new_user.notificationSubscriptions = asdict( NotificationSubscriptions(marketing_email=bool(request.json.get("contact_ok"))) ) if settings.IS_INTEGRATION: objects_to_save.append(payments_api.create_deposit(new_user, "test")) else: authorized_emails, departement_codes = get_authorized_emails_and_dept_codes(ttl_hash=get_ttl_hash()) departement_code = _get_departement_code_when_authorized_or_error(authorized_emails, departement_codes) new_user.departementCode = departement_code new_user.remove_admin_role() new_user.remove_beneficiary_role() new_user.isEmailValidated = True new_user.needsToFillCulturalSurvey = False new_user.hasSeenTutorials = True objects_to_save.append(new_user) repository.save(*objects_to_save) update_external_user(new_user) return jsonify(as_dict(new_user, includes=BENEFICIARY_INCLUDES)), 201
def create_beneficiary_from_application(application_detail: dict, user: Optional[User] = None) -> User: if not user: beneficiary = User() beneficiary.password = random_password() beneficiary.email = application_detail["email"] beneficiary.dateOfBirth = application_detail["birth_date"] else: beneficiary = user beneficiary.lastName = application_detail["last_name"] beneficiary.firstName = application_detail["first_name"] beneficiary.publicName = "%s %s" % (application_detail["first_name"], application_detail["last_name"]) beneficiary.phoneNumber = application_detail["phone"] beneficiary.departementCode = application_detail["department"] beneficiary.postalCode = application_detail["postal_code"] beneficiary.civility = application_detail["civility"] beneficiary.activity = application_detail["activity"] beneficiary.isAdmin = False beneficiary.hasSeenTutorials = False generate_reset_token(beneficiary, validity_duration_hours=THIRTY_DAYS_IN_HOURS) beneficiary.isBeneficiary = True application_id = application_detail["application_id"] deposit = payments_api.create_deposit( beneficiary, f"démarches simplifiées dossier [{application_id}]") beneficiary.deposits = [deposit] return beneficiary
def fulfill_beneficiary_data(user: User, deposit_source: str, deposit_version: int = None) -> User: _generate_random_password(user) deposit = payment_api.create_deposit(user, deposit_source, version=deposit_version) user.deposits = [deposit] return user
def activate_beneficiary( user: users_models.User, deposit_source: str = None, has_activated_account: Optional[bool] = True ) -> users_models.User: if not deposit_source: beneficiary_import = subscription_repository.get_beneficiary_import_for_beneficiary(user) if not beneficiary_import: raise exceptions.BeneficiaryImportMissingException() eligibility = beneficiary_import.eligibilityType deposit_source = beneficiary_import.get_detailed_source() else: eligibility = users_models.EligibilityType.AGE18 if eligibility == users_models.EligibilityType.UNDERAGE: user.add_underage_beneficiary_role() elif eligibility == users_models.EligibilityType.AGE18: user.add_beneficiary_role() else: raise users_exception.InvalidEligibilityTypeException() if "apps_flyer" in user.externalIds: apps_flyer_job.log_user_becomes_beneficiary_event_job.delay(user.id) deposit = payments_api.create_deposit(user, deposit_source=deposit_source, eligibility=eligibility) db.session.add_all((user, deposit)) db.session.commit() logger.info("Activated beneficiary and created deposit", extra={"user": user.id, "source": deposit_source}) db.session.refresh(user) update_external_user(user) _send_beneficiary_activation_email(user, has_activated_account) return user
def fulfill_user_data(user: User, deposit_source: str) -> User: user.password = random_password() generate_reset_token(user, validity_duration_hours=THIRTY_DAYS_IN_HOURS) deposit = payment_api.create_deposit(user, deposit_source) user.deposits = [deposit] return user
def activate_beneficiary(user: User, deposit_source: str) -> User: if not is_user_eligible(user): raise exceptions.NotEligible() user.isBeneficiary = True deposit = payment_api.create_deposit(user, deposit_source=deposit_source) db.session.add_all((user, deposit)) db.session.commit() return user
def grant_wallet_to_existing_users(user_ids: List[int]): if settings.IS_PROD: raise ValueError("This action is not available on production") users = User.query.filter(User.id.in_(user_ids)).all() for user in users: user.isBeneficiary = True deposit = payments_api.create_deposit(user, "public") repository.save(user, deposit)
def create_or_update_users(rows: Iterable[dict]) -> list[User]: # The purpose of this function is to recreate test users on # staging after the staging database is reset. It's not meant to # be used anywhere else, and certainly not on production. if settings.IS_PROD: raise ValueError( "This function is not supposed to be run on production") users = [] for row in rows: user = find_user_by_email(row["Mail"]) birthdate = datetime.strptime(row["Date de naissance"], "%Y-%m-%d") if user: user.dateOfBirth = birthdate user.setPassword(settings.STAGING_TEST_USER_PASSWORD) else: user = users_api.create_account( email=sanitize_email(row["Mail"]), password=settings.STAGING_TEST_USER_PASSWORD, birthdate=birthdate, is_email_validated=True, send_activation_mail=False, remote_updates=False, ) deposit = payments_api.create_deposit(user, "import_users (csv)") repository.save(deposit) user.add_beneficiary_role() user.lastName = row["Nom"] user.firstName = row["Prénom"] user.publicName = f"{user.firstName} {user.lastName}" user.phoneNumber = row["Téléphone"] user.departementCode = row["Département"] user.postalCode = row["Code postal"] repository.save(user) users.append(user) logger.info("Created or updated user=%s from CSV import", user.id) admin = find_user_by_email("*****@*****.**") if not admin: admin = users_api.create_account( email="*****@*****.**", password=settings.STAGING_TEST_USER_PASSWORD, birthdate=datetime(1946, 12, 24), is_email_validated=True, send_activation_mail=False, remote_updates=False, ) admin.setPassword(settings.STAGING_TEST_USER_PASSWORD) admin.remove_beneficiary_role() admin.add_admin_role() admin.firstName = "Jeanne" admin.lastName = "Admin" admin.publicName = f"{user.firstName} {user.lastName}" repository.save(admin) logger.info("Created or updated admin user=%s", admin.id) return users
def change_pro_users_to_beneficiary(pro_users_ids: list[int]) -> None: users = User.query.filter(User.id.in_(pro_users_ids)).all() for user in users: user.add_beneficiary_role() user.remove_pro_role() user.needsToFillCulturalSurvey = True deposit = payments_api.create_deposit(user, "public") repository.save(user, deposit) user_offerer = UserOfferer.query.filter_by(user=user).all() repository.delete(*user_offerer)
def test_cannot_create_twice_a_deposit_of_same_type(self): # Given AGE18_ELIGIBLE_BIRTH_DATE = datetime.now().replace( hour=0, minute=0, second=0, microsecond=0) - relativedelta( years=18, months=2) beneficiary = users_factories.BeneficiaryGrant18Factory( dateOfBirth=AGE18_ELIGIBLE_BIRTH_DATE) # When with pytest.raises( exceptions.DepositTypeAlreadyGrantedException) as error: api.create_deposit(beneficiary, "created by test") # Then assert Deposit.query.filter( Deposit.userId == beneficiary.id).count() == 1 assert error.value.errors["user"] == [ 'Cet utilisateur a déjà été crédité de la subvention "GRANT_18".' ]
def test_deposit_created_with_an_expiration_date(self, app): # Given beneficiary = UserFactory(email="*****@*****.**") repository.delete(*beneficiary.deposits) # When deposit = create_deposit(beneficiary, "created by test") # Then assert deposit.expirationDate == datetime(2023, 2, 5, 9, 0, 0)
def test_deposit_created_with_version_1(self): # Given beneficiary = users_factories.UserFactory( dateOfBirth=datetime.combine(datetime.utcnow(), time(0, 0)) - relativedelta(years=18, months=2)) deposit = api.create_deposit(beneficiary, "created by test", version=1) assert deposit.version == 1 assert deposit.amount == Decimal(500) assert deposit.source == "created by test"
def test_create_18_years_old_deposit(self): beneficiary = users_factories.UserFactory( dateOfBirth=datetime.combine(datetime.utcnow(), time(0, 0)) - relativedelta(years=18, months=4)) deposit = api.create_deposit(beneficiary, "created by test") assert deposit.type == DepositType.GRANT_18 assert deposit.version == 2 assert deposit.amount == Decimal(300) assert deposit.user.id == beneficiary.id assert deposit.expirationDate == datetime(2023, 2, 5, 9, 0, 0)
def test_wallet_balance(self): with freeze_time(datetime.utcnow() - relativedelta(years=2, days=2)): user = users_factories.UnderageBeneficiaryFactory( subscription_age=16) # disable trigger because deposit.expirationDate > now() is False in database time db.session.execute( "ALTER TABLE booking DISABLE TRIGGER booking_update;") bookings_factories.IndividualBookingFactory( individualBooking__user=user, amount=18) db.session.execute( "ALTER TABLE booking ENABLE TRIGGER booking_update;") payments_api.create_deposit(user, "test") bookings_factories.IndividualBookingFactory( individualBooking__user=user, isUsed=True, amount=10) bookings_factories.IndividualBookingFactory( individualBooking__user=user, isUsed=False, amount=1) assert db.session.query(func.get_wallet_balance( user.id, False)).first()[0] == Decimal(289) assert db.session.query(func.get_wallet_balance( user.id, True)).first()[0] == Decimal(290)
def test_create_underage_deposit(self, age, expected_amount): beneficiary = users_factories.UserFactory( dateOfBirth=datetime.combine(datetime.utcnow(), time(0, 0)) - relativedelta(years=age, months=2)) deposit = api.create_deposit(beneficiary, "created by test", beneficiary.eligibility) assert deposit.type == DepositType.GRANT_15_17 assert deposit.version == 1 assert deposit.amount == expected_amount assert deposit.user.id == beneficiary.id assert deposit.expirationDate == datetime(2021 - (age + 1) + 18, 12, 5, 0, 0, 0)
def create_pro_user(pro_user: ProUserCreationBodyModel) -> User: new_pro_user = User(from_dict=pro_user.dict(by_alias=True)) new_pro_user.email = sanitize_email(new_pro_user.email) new_pro_user.notificationSubscriptions = asdict(NotificationSubscriptions(marketing_email=pro_user.contact_ok)) new_pro_user.remove_admin_role() new_pro_user.remove_beneficiary_role() new_pro_user.needsToFillCulturalSurvey = False new_pro_user.generate_validation_token() if pro_user.postal_code: new_pro_user.departementCode = PostalCode(pro_user.postal_code).get_departement_code() if settings.IS_INTEGRATION: new_pro_user.add_beneficiary_role() deposit = payment_api.create_deposit(new_pro_user, "integration_signup") new_pro_user.deposits = [deposit] return new_pro_user
def signup_webapp(): objects_to_save = [] check_valid_signup_webapp(request) new_user = User(from_dict=request.json) if request.json.get("contact_ok"): new_user.hasAllowedRecommendations = True if settings.IS_INTEGRATION: new_user.departementCode = "00" objects_to_save.append(payments_api.create_deposit(new_user, "test")) else: authorized_emails, departement_codes = get_authorized_emails_and_dept_codes() departement_code = _get_departement_code_when_authorized_or_error(authorized_emails, departement_codes) new_user.departementCode = departement_code new_user.isBeneficiary = False new_user.isAdmin = False new_user.isEmailValidated = True objects_to_save.append(new_user) repository.save(*objects_to_save) return jsonify(as_dict(new_user, includes=BENEFICIARY_INCLUDES)), 201
def activate_beneficiary(user: User, deposit_source: str) -> User: user.isBeneficiary = True deposit = payment_api.create_deposit(user, deposit_source=deposit_source) db.session.add_all((user, deposit)) db.session.commit() return user
def create_industrial_webapp_users(): logger.info("create_industrial_webapp_users") users_by_name = {} deposit_versions = {} validation_prefix, validation_suffix = "AZERTY", 123 validation_suffix += 1 variants = itertools.product(DEPARTEMENT_CODES, WEBAPP_TAGS, DEPOSIT_VERSIONS) for departement_code, tag, deposit_version in variants: short_tag = "".join([chunk[0].upper() for chunk in tag.split("-")]) if tag == "has-signed-up": reset_password_token = "{}{}".format(validation_prefix, validation_suffix) validation_suffix += 1 else: reset_password_token = None cultural_survey_id = None needs_to_fill_cultural_survey = False has_seen_tutorials = True if tag == "has-filled-cultural-survey": has_seen_tutorials = False if tag == "has-signed-up": cultural_survey_id = uuid.uuid4() needs_to_fill_cultural_survey = True has_seen_tutorials = False email = f"pctest.jeune{departement_code}.{tag}.v{deposit_version}@example.com" user = create_user( cultural_survey_id=cultural_survey_id, departement_code=str(departement_code), email=email, first_name="PC Test Jeune", date_of_birth=datetime(2003, 1, 1), has_seen_tutorials=has_seen_tutorials, last_name=f"{departement_code} {short_tag} {deposit_version}", needs_to_fill_cultural_survey=needs_to_fill_cultural_survey, postal_code="{}100".format(departement_code), public_name= f"PC Test Jeune {departement_code} {short_tag} {deposit_version}", reset_password_token=reset_password_token, reset_password_token_validity_limit=datetime.utcnow() + timedelta(hours=24), ) user_key = f"jeune{departement_code} {tag} v{deposit_version}" users_by_name[user_key] = user deposit_versions[user_key] = deposit_version repository.save(*users_by_name.values()) for user_key, user in users_by_name.items(): # FIXME (asaunier, 2021-01-27): There are only 2 accounts in production where beneficiaries have no deposit # including one passculture account. if not ("has-signed-up" in user_key or "has-booked-activation" in user_key): deposit = create_deposit( user, deposit_source="sandbox", version=deposit_versions[user_key], ) repository.save(deposit) logger.info("created %d users", len(users_by_name)) return users_by_name
def save_bookings_recap_sandbox(): yesterday = datetime.utcnow() - timedelta(days=1) today = datetime.utcnow() beneficiary1 = create_user( public_name="Riri Duck", first_name="Riri", last_name="Duck", email="*****@*****.**", ) beneficiary2 = create_user( public_name="Fifi Brindacier", first_name="Fifi", last_name="Brindacier", email="*****@*****.**", ) beneficiary3 = create_user( public_name="LouLou Duck", first_name="Loulou", last_name="Duck", email="*****@*****.**", ) repository.save(beneficiary1, beneficiary2, beneficiary3) deposit1 = create_deposit(beneficiary1, "public") deposit2 = create_deposit(beneficiary2, "public") deposit3 = create_deposit(beneficiary3, "public") repository.save(deposit1, deposit2, deposit3) pro = create_user( public_name="Balthazar Picsou", first_name="Balthazar", last_name="Picsou", email="*****@*****.**", is_beneficiary=False, ) offerer = create_offerer(siren="645389012", ) user_offerer = create_user_offerer(user=pro, offerer=offerer) venue1 = create_venue(offerer, name="Cinéma Le Monde Perdu", siret="64538901265877") venue2 = create_venue(offerer, name="Librairie Atlantis", siret="64538901201379") venue3 = create_venue(offerer, name="Théatre Mordor", siret="64538954601379") venue4_virtual = create_venue(offerer, name="Un lieu virtuel", siret=None, is_virtual=True) offer1_venue1 = create_offer_with_event_product( venue=venue1, event_name="Jurassic Park", event_type=EventType.CINEMA, is_duo=True, ) stock_1_offer1_venue1 = create_stock( offer=offer1_venue1, beginning_datetime=yesterday, quantity=None, price=12.99, ) offer2_venue1 = create_offer_with_event_product( venue=venue1, event_name="Matrix", event_type=EventType.CINEMA, is_duo=False, ) stock_2_offer2_venue1 = create_stock( offer=offer2_venue1, beginning_datetime=today, quantity=None, price=0, ) offer1_venue2 = create_offer_with_thing_product( venue=venue2, thing_name="Fondation", thing_type=ThingType.LIVRE_EDITION, extra_data={"isbn": "9788804119135"}) stock_1_offer1_venue2 = create_stock( offer=offer1_venue2, quantity=42, price=9.99, ) offer2_venue2 = create_offer_with_thing_product( venue=venue2, thing_name="Martine à la playa", thing_type=ThingType.LIVRE_EDITION, extra_data={"isbn": "9787605639121"}, ) stock_1_offer2_venue2 = create_stock( offer=offer2_venue2, quantity=12, price=49.99, ) offer1_venue3 = create_offer_with_event_product( venue=venue3, event_name="Danse des haricots", event_type=EventType.SPECTACLE_VIVANT, ) stock_1_offer1_venue3 = create_stock( offer=offer1_venue3, quantity=44, price=18.50, ) offer1_venue4 = create_offer_with_thing_product( venue=venue4_virtual, thing_name="Le livre des haricots", thing_type=ThingType.LIVRE_EDITION, ) stock_1_offer1_venue4 = create_stock( offer=offer1_venue4, quantity=70, price=10.99, ) booking1_beneficiary1 = create_booking( user=beneficiary1, stock=stock_1_offer1_venue1, date_created=datetime(2020, 3, 18, 14, 56, 12, 0), is_used=True, date_used=datetime(2020, 3, 22, 17, 00, 10, 0), quantity=2, ) booking2_beneficiary1 = create_booking( user=beneficiary1, stock=stock_2_offer2_venue1, date_created=datetime(2020, 4, 22, 9, 17, 12, 0), ) booking1_beneficiary2 = create_booking( user=beneficiary2, stock=stock_1_offer1_venue1, date_created=datetime(2020, 3, 18, 12, 18, 12, 0), is_used=True, date_used=datetime(2020, 5, 2), quantity=2, ) booking2_beneficiary2 = create_booking( user=beneficiary2, stock=stock_1_offer1_venue2, date_created=datetime(2020, 4, 12, 14, 31, 12, 0), is_cancelled=False, ) booking1_beneficiary3 = create_booking( user=beneficiary3, stock=stock_2_offer2_venue1, date_created=datetime(2020, 1, 4, 19, 31, 12, 0), is_cancelled=False, is_used=True, date_used=datetime(2020, 1, 4, 23, 00, 10, 0), quantity=2, ) booking2_beneficiary3 = create_booking( user=beneficiary3, stock=stock_1_offer1_venue2, date_created=datetime(2020, 3, 21, 22, 9, 12, 0), is_cancelled=False, ) booking3_beneficiary1 = create_booking( user=beneficiary1, stock=stock_1_offer1_venue3, date_created=datetime(2020, 4, 12, 14, 31, 12, 0), ) payment_booking3_beneficiary1 = create_payment( booking=booking3_beneficiary1, offerer=offerer, status=TransactionStatus.PENDING) booking3_beneficiary2 = create_booking( user=beneficiary2, stock=stock_1_offer1_venue3, date_created=datetime(2020, 4, 12, 19, 31, 12, 0), is_used=True, date_used=datetime(2020, 4, 22, 17, 00, 10, 0), is_cancelled=False, ) payment_booking3_beneficiary2 = create_payment( booking=booking3_beneficiary2, offerer=offerer, status=TransactionStatus.SENT) booking3_beneficiary3 = create_booking( user=beneficiary3, stock=stock_1_offer1_venue3, date_created=datetime(2020, 4, 12, 22, 9, 12, 0), ) payment_booking3_beneficiary3 = create_payment( booking=booking3_beneficiary3, offerer=offerer, status=TransactionStatus.ERROR) booking4_beneficiary3 = create_booking( user=beneficiary3, stock=stock_1_offer1_venue2, date_created=datetime(2020, 3, 21, 22, 9, 12, 0), is_cancelled=False, is_used=False, ) booking5_beneficiary3 = create_booking( user=beneficiary3, stock=stock_1_offer1_venue4, date_created=datetime(2020, 3, 21, 22, 9, 12, 0), is_cancelled=False, ) booking6_beneficiary3 = create_booking( user=beneficiary3, stock=stock_1_offer2_venue2, date_created=datetime(2020, 3, 21, 22, 9, 12, 0), is_used=True, date_used=datetime(2020, 4, 22, 21, 9, 12, 0), ) payment_booking6_beneficiary3 = create_payment( booking=booking6_beneficiary3, offerer=offerer, status=TransactionStatus.SENT) booking7_beneficiary2 = create_booking( user=beneficiary2, stock=stock_1_offer2_venue2, date_created=datetime(2020, 4, 21, 22, 6, 12, 0), is_used=True, date_used=datetime(2020, 4, 22, 22, 9, 12, 0), ) payment_booking7_beneficiary2 = create_payment( booking=booking7_beneficiary2, offerer=offerer, status=TransactionStatus.RETRY) booking8_beneficiary1 = create_booking( user=beneficiary1, stock=stock_1_offer2_venue2, date_created=datetime(2020, 2, 21, 22, 6, 12, 0), is_used=True, date_used=datetime(2020, 4, 22, 23, 9, 12, 0), ) payment_booking8_beneficiary1 = create_payment( booking=booking8_beneficiary1, offerer=offerer, status=TransactionStatus.PENDING) repository.save( pro, booking1_beneficiary1, booking2_beneficiary1, booking1_beneficiary2, booking2_beneficiary2, booking1_beneficiary3, booking2_beneficiary3, booking5_beneficiary3, payment_booking3_beneficiary1, payment_booking3_beneficiary2, payment_booking3_beneficiary3, user_offerer, payment_booking6_beneficiary3, payment_booking7_beneficiary2, payment_booking8_beneficiary1, booking4_beneficiary3, ) bookings_to_cancel = [ booking2_beneficiary2, booking1_beneficiary3, booking2_beneficiary3, booking3_beneficiary2, booking5_beneficiary3, ] for booking in bookings_to_cancel: booking.isCancelled = True repository.save(*bookings_to_cancel)