def setUp(self): self.config = testing.setUp() self.config.include('pyramid_mailer.testing') self.config.registry.settings['c3smembership.url'] = 'http://foo.com' self.config.registry.settings['c3smembership.mailaddr'] = '*****@*****.**' DBSession.remove() self.session = _initTestingDB()
def test_get(self): """ Tests the ShareRepository.get method. """ # pylint: disable=no-member share = DBSession.query(Shares).filter( Shares.reference_code == u'share1').first() get_share = ShareRepository.get(share.id) self.assertEqual(get_share.id, share.id) # pylint: disable=no-member share = DBSession.query(Shares).filter( Shares.reference_code == u'share2').first() get_share = ShareRepository.get(share.id) self.assertEqual(get_share.id, share.id) # pylint: disable=no-member share = DBSession.query(Shares).filter( Shares.reference_code == u'share3').first() get_share = ShareRepository.get(share.id) self.assertEqual(get_share.id, share.id) # pylint: disable=no-member share = DBSession.query(Shares).filter( Shares.reference_code == u'share4').first() get_share = ShareRepository.get(share.id) self.assertEqual(get_share.id, share.id)
def tearDown(self): """ Tear down all test cases """ DBSession.close() DBSession.remove() testing.tearDown()
def make_member_ready_for_approval(self): with transaction.manager: member1 = C3sMember( # german firstname=u'SomeFirstnäme', lastname=u'SomeLastnäme', email=u'*****@*****.**', address1=u"addr one", address2=u"addr two", postcode=u"12345", city=u"Footown Mäh", country=u"Foocountry", locale=u"DE", date_of_birth=date.today(), email_is_confirmed=False, email_confirm_code=u'ABCDEFGFOO', password=u'arandompassword', date_of_submission=date.today(), membership_type=u'normal', member_of_colsoc=True, name_of_colsoc=u"GEMA", num_shares=u'23', ) member1.signature_received = True member1.payment_received = True DBSession.add(member1)
def tearDown(self): """ clean up after a test case """ DBSession.close() DBSession.remove() testing.tearDown()
def setUp(self): self.config = testing.setUp() self.config.include('pyramid_mailer.testing') try: DBSession.close() DBSession.remove() # print("removed old DBSession ==============================") except: # print("no DBSession to remove =============================") pass # try: # os.remove('test_webtest_functional.db') # #print "deleted old test database" # except: # pass # #print "never mind" my_settings = { # 'sqlalchemy.url': 'sqlite:///test_webtest_functional.db', 'sqlalchemy.url': 'sqlite:///:memory:', 'available_languages': 'da de en es fr', 'c3smembership.mailaddr': '*****@*****.**', 'testing.mail_to_console': 'false' } engine = engine_from_config(my_settings) DBSession.configure(bind=engine) self.session = DBSession # () Base.metadata.create_all(engine) # dummy database entries for testing with transaction.manager: member1 = C3sMember( # german firstname=u'SomeFirstnäme', lastname=u'SomeLastnäme', email=u'*****@*****.**', address1=u"addr one", address2=u"addr two", postcode=u"12345", city=u"Footown Mäh", country=u"Foocountry", locale=u"DE", date_of_birth=date.today(), email_is_confirmed=False, email_confirm_code=u'ABCDEFGFOO', password=u'arandompassword', date_of_submission=date.today(), membership_type=u'normal', member_of_colsoc=True, name_of_colsoc=u"GEMA", num_shares=u'23', ) DBSession.add(member1) DBSession.flush() from c3smembership import main app = main({}, **my_settings) app.registry.get_mailer = get_mailer from webtest import TestApp self.testapp = TestApp(app)
def test_create(self): """ Tests the ShareRepository.create method. """ # pylint: disable=no-member member1 = DBSession.query(C3sMember).filter( C3sMember.membership_number == 'member1').first() self.assertEqual(member1.num_shares, 12 + 23) share_id = ShareRepository.create('member1', 25, date(2016, 4, 23)) self.assertEqual(member1.num_shares, 12 + 23 + 25) self.assertEqual(len(member1.shares), 3) # pylint: disable=no-member shares = DBSession.query(Shares).filter(Shares.id == share_id).first() self.assertEqual(shares.number, 25) self.assertEqual(shares.date_of_acquisition, date(2016, 4, 23)) self.assertEqual(shares.reference_code, None) self.assertEqual(shares.signature_received, False) self.assertEqual(shares.signature_received_date, date(1970, 1, 1)) self.assertEqual(shares.signature_confirmed, False) self.assertEqual(shares.signature_confirmed_date, date(1970, 1, 1)) self.assertEqual(shares.payment_received, False) self.assertEqual(shares.payment_received_date, date(1970, 1, 1)) self.assertEqual(shares.payment_confirmed, False) self.assertEqual(shares.payment_confirmed_date, date(1970, 1, 1)) self.assertEqual(shares.accountant_comment, None)
def setUp(self): self.config = testing.setUp() self.config.set_session_factory(session_factory_from_settings({})) self.config.include('pyramid_mailer.testing') self.config.include('pyramid_chameleon') self.config.include('c3smembership.presentation.view_processing') self.error_handler = TestErrorHandler() self.config.set_colander_error_handler(self.error_handler) DBSession.remove() self.db_session = init_testing_db() self.config.registry.settings['testing.mail_to_console'] = 'no' self.config.registry.settings['c3smembership.notification_sender'] = \ '*****@*****.**' self.config.add_route('join', '/') self.config.add_route('detail', '/detail') self.config.add_route('dashboard', '/') self.config.add_route('certificate_pdf', '/') self.config.add_route( 'certificate_pdf_staff', '/certificate_pdf_staff/{member_id}') self.config.add_route( 'membership_listing_backend', '/membership_listing_backend') self.config.add_route( 'certificate_mail', '/cert_mail/{member_id}') self.config.scan( 'c3smembership.presentation.views.membership_certificate') self.testapp = TestApp(self.config.make_wsgi_app())
def tearDown(self): """ Clean up database """ DBSession().close() DBSession.remove() testing.tearDown()
def create(cls, membership_number, shares_quantity, board_confirmation=None): """ Create a shares package. Args: membership_number: The membership number of the member for which the shares package is created. shares_quantity: The number of shares of the package to be created. board_confirmation: Optional. The date on which the board of directors confirmed the acquisition of the shares package. Returns: The technical primary key of the created shares package. """ shares = Shares( number=shares_quantity, date_of_acquisition=board_confirmation, ) # pylint: disable=no-member member = DBSession.query(C3sMember).filter( C3sMember.membership_number == membership_number).first() # pylint: disable=no-member DBSession.add(shares) member.shares.append(shares) member.num_shares += shares_quantity DBSession.flush() return shares.id
def setUp(self): self.config = testing.setUp() self.config.include('pyramid_mailer.testing') self.config.include('pyramid_chameleon') DBSession.remove() self.session = _initTestingDB() self.config.registry.settings['testing.mail_to_console'] = 'no'
def delete_by_id(cls, staff_id): """ Delete one C3sStaff object by id. """ row = DBSession.query(cls).filter(cls.id == staff_id).first() row.groups = [] DBSession.query(cls).filter(cls.id == staff_id).delete()
def setUp(self): self.config = testing.setUp() self.config.include('pyramid_mailer.testing') try: DBSession.close() DBSession.remove() # print("removed old DBSession ==============================") except: # print("no DBSession to remove =============================") pass # try: # os.remove('test_webtest_functional.db') # #print "deleted old test database" # except: # pass # #print "never mind" my_settings = { # 'sqlalchemy.url': 'sqlite:///test_webtest_functional.db', 'sqlalchemy.url': 'sqlite:///:memory:', 'available_languages': 'da de en es fr', 'c3smembership.notification_sender': '*****@*****.**', 'testing.mail_to_console': 'false'} engine = engine_from_config(my_settings) DBSession.configure(bind=engine) self.session = DBSession # () Base.metadata.create_all(engine) # dummy database entries for testing with transaction.manager: member1 = C3sMember( # german firstname=u'SomeFirstnäme', lastname=u'SomeLastnäme', email=u'*****@*****.**', address1=u"addr one", address2=u"addr two", postcode=u"12345", city=u"Footown Mäh", country=u"Foocountry", locale=u"DE", date_of_birth=date.today(), email_is_confirmed=False, email_confirm_code=u'ABCDEFGFOO', password=u'arandompassword', date_of_submission=date.today(), membership_type=u'normal', member_of_colsoc=True, name_of_colsoc=u"GEMA", num_shares=u'23', ) DBSession.add(member1) DBSession.flush() from c3smembership import main app = main({}, **my_settings) app.registry.get_mailer = get_mailer from webtest import TestApp self.testapp = TestApp(app)
def __set_up_database(cls): """ Set up the database and create staff """ engine = engine_from_config(cls.SETTINGS) DBSession.configure(bind=engine) Base.metadata.create_all(engine) cls.__create_staff()
def tearDown(self): """ Tear down the set setup """ # pylint: disable=no-member DBSession.close() # pylint: disable=no-member DBSession.remove() GeneralAssemblyRepository.datetime = datetime
def test_usage(self): from c3smembership.scripts.initialize_db import usage argv = ['initialize_c3sMembership_db'] try: usage(argv) except: pass DBSession.close() DBSession.remove()
def init(): engine = engine_from_config({'sqlalchemy.url': 'sqlite://'}) DBSession.configure(bind=engine) Base.metadata.create_all(engine) # Setup alembic database migration information. # This creates the alembic_version table in the database # which is the basis for migrations and the "alembic current" # command. alembic_cfg = Config('alembic.ini') command.stamp(alembic_cfg, 'head')
def delete(cls, shares_id): """ Deletes the shares package of the specified shares id. Args: shares_id: The technical primary key of the shares package to be deleted. """ # pylint: disable=no-member DBSession.query(Shares).filter(Shares.id == shares_id).delete()
def setUp(self): self.config = testing.setUp() self.config.include('pyramid_mailer.testing') self.config.registry.settings[ 'c3smembership.url'] = 'https://yes.c3s.cc' self.config.registry.settings['c3smembership.mailaddr'] = '*****@*****.**' self.config.registry.settings['testing.mail_to_console'] = 'false' DBSession.remove() self.session = _initTestingDB()
def tearDownClass(cls): """ Remove the database The database must be set up each time a test case is initialized in order to have clean data. """ db_session = cls.get_db_session() db_session.close() DBSession.remove()
def test_main_correct(self): """ test the initialize_c3sMembership_db script with correct arguments """ from c3smembership.scripts.initialize_db import main filename = 'webdrivertest.db' if os.path.isfile(filename): os.unlink(filename) argv = ['initialize_c3sMembership_db', 'webdrivertest.ini'] main(argv) DBSession.close() DBSession.remove()
def setUp(self): self.config = testing.setUp() self.config.include('pyramid_mailer.testing') self.config.registry.settings[ 'c3smembership.url'] = 'https://yes.c3s.cc' self.config.registry.settings['c3smembership.notification_sender'] = \ '*****@*****.**' self.config.registry.settings['c3smembership.status_receiver'] = \ '*****@*****.**' self.config.registry.settings['testing.mail_to_console'] = 'false' self.config.registry.get_mailer = get_mailer DBSession.remove() self.session = DBSession
def setUp(self): self.config = testing.setUp() self.config.include('pyramid_mailer.testing') self.config.include('c3smembership.presentation.pagination') self.config.registry.settings['testing.mail_to_console'] = 'false' self.config.add_route('dashboard', '/') def dashboard_content_size_provider(filtering): return 0 self.config.make_pagination_route( 'dashboard', 'id', dashboard_content_size_provider) DBSession.remove() self.session = _initTestingDB()
def setUp(self): self.config = testing.setUp() self.config.include('pyramid_mailer.testing') self.config.include('c3smembership.presentation.pagination') self.config.registry.settings['testing.mail_to_console'] = 'false' self.config.add_route('dashboard', '/') def dashboard_content_size_provider(filtering): return 0 self.config.make_pagination_route('dashboard', 'id', dashboard_content_size_provider) DBSession.remove() self.session = _initTestingDB()
def create_general_assembly(cls, number, name, date): """ Create a general assembly Args: number: Integer. The number of the general assembly as a unique identifier. name: String. The name of the general assembly. date: `datetime.date`. The date at which the general assembly takes place. """ assembly = GeneralAssembly(number, name, date) # pylint: disable=no-member DBSession.add(assembly) DBSession.flush()
def connect(self, cfg, customAppSettings={}, wrapper='StopableWSGIServer'): self.cfg = cfg # clear old connections # try: # DBSession.close() # DBSession.remove() # os.remove(self.cfg['app']['db']) # except: # pass # create appConfig from ini self.appSettings = appconfig( 'config:' + os.path.join( os.path.dirname(__file__), '../../', self.cfg['app']['ini'] ) ) # store some derived variables self.appSettings['sqlalchemy.url'] = 'sqlite:///'+self.cfg['app']['db'] # merge/override appConfig with custom settings in cfg self.appSettings.update(self.cfg['app']['appSettings']) # merge/override appConfig with individual custom settings self.appSettings.update(customAppSettings) # app engine = engine_from_config(self.appSettings) DBSession.configure(bind=engine) Base.metadata.create_all(engine) from c3smembership import main app = main({}, **self.appSettings) # create srv if wrapper == 'StopableWSGIServer': self.srv = StopableWSGIServer.create( app, host=self.cfg['app']['host'], port=self.cfg['app']['port'] ) # check srv if not self.srv.wait(): raise Exception('Server could not be fired up. Exiting ...') elif wrapper == 'TestApp': self.srv = TestApp(app) else: raise Exception('Wrapper could not be found. Exiting ...') # store some variables self.srv.db = DBSession self.srv.url = 'http://' + self.cfg['app']['host'] + ':' \ + self.cfg['app']['port'] + '/' # self.srv.lu = 'lu/' + self.cfg['member']['token'] + '/' \ # + self.cfg['member']['email'] return self.srv
def make_unconnected_shares(self): with transaction.manager: shares2 = Shares( number=23, date_of_acquisition=date.today(), reference_code=u'IJKLMNO', signature_received=True, signature_received_date=date(2014, 1, 7), payment_received=True, payment_received_date=date(2014, 1, 8), signature_confirmed=True, signature_confirmed_date=date(2014, 1, 8), payment_confirmed=True, payment_confirmed_date=date(2014, 1, 9), accountant_comment=u'not connected', ) DBSession.add(shares2)
def get_all(cls): """ Get all C3sStaff objects from the database. Returns: list: list of C3sStaff objects. """ return DBSession.query(cls).all()
def invite_member(cls, membership_number, general_assembly_number, token): """ Store the member invitation for the general assembly Args: membership_number: Integer. The membership number of the member for which the general assembly invitation is stored. general_assembly_number: Integer. The number of the general assembly for which the invitation is stored for the member. token: String. The token set to verify the member for API access by the ticketing application. """ # pylint: disable=no-member member = MemberRepository.get_member(membership_number) assembly = cls.get_general_assembly(general_assembly_number) invitation = GeneralAssemblyInvitation( assembly, member, cls.datetime.now(), token) DBSession.add(invitation) DBSession.flush()
def setUp(self): """ set up everything for a test case """ self.config = testing.setUp() self.config.include('pyramid_mailer.testing') try: DBSession.close() DBSession.remove() # print("removing old DBSession ==============================") except: # print("no DBSession to remove ==============================") pass from sqlalchemy import create_engine # engine = create_engine('sqlite:///test_utils.db') engine = create_engine('sqlite:///:memory:') DBSession.configure(bind=engine) self.session = DBSession # () Base.metadata.create_all(engine) with transaction.manager: member1 = C3sMember( # german firstname=u'SomeFirstnäme', lastname=u'SomeLastnäme', email=u'*****@*****.**', address1=u"addr one", address2=u"addr two", postcode=u"12345", city=u"Footown Mäh", country=u"Foocountry", locale=u"DE", date_of_birth=date.today(), email_is_confirmed=False, email_confirm_code=u'ABCDEFGBAR', password=u'arandompassword', date_of_submission=date.today(), membership_type=u'normal', member_of_colsoc=True, name_of_colsoc=u"GEMA", num_shares=u'23', ) DBSession.add(member1) DBSession.flush()
def get_invitees(cls, general_assembly_number, invitees_count): """ Gets a number of members which have not yet been invited to the general assembly. Queries the database for members, where: - members are members - members have not received their invitation email yet Args: general_assembly_number: Integer. The number of the general assembly for which the invitees are returned. invitees_count: Integer. Number of invitees returned at maximum. Returns: A list member objects. """ # pylint: disable=no-member # In SqlAlchemy the True comparison must be done as "a == True" and not # in the python default way "a is True". Therefore: # pylint: disable=singleton-comparison return ( # Get members DBSession.query(C3sMember) # combine with the general assembly requested as a cross join with # the one general assembly row .join( GeneralAssembly, GeneralAssembly.number == general_assembly_number) # combine them with invitations for this member to this general # assembly if any .outerjoin( GeneralAssemblyInvitation, and_( C3sMember.id == GeneralAssemblyInvitation.member_id, GeneralAssemblyInvitation.general_assembly_id == GeneralAssembly.id ) ) # but only .filter( and_( # if no invitation has been sent GeneralAssemblyInvitation.id == None, # and the member has membership at the assmebly date C3sMember.is_member_filter(GeneralAssembly.date), ) ) # get as many as requested .slice(0, invitees_count) # and get all of the actual records .all() )
def test_main_false(self): """ test the initialize_c3sMembership_db script with faulty arguments get it wrong: wrong arguments: * must be at least one argument * must be name of an existing file this gets coverage for the "usage" function in scripts/initialize_db.py """ from c3smembership.scripts.initialize_db import main argv = [] with self.assertRaises(IndexError): main(argv) argv = ['notExisting.ini', ] with self.assertRaises(SystemExit) as context: main(argv) self.assertEqual(context.exception.code, 1) DBSession.close() DBSession.remove()
def connect(self, cfg, customAppSettings=None, wrapper='StopableWSGIServer'): if customAppSettings is None: customAppSettings = {} self.cfg = cfg self.app_settings = appconfig( 'config:' + os.path.join( os.path.dirname(__file__), '../../', self.cfg['app']['ini'] ) ) # store some derived variables self.app_settings['sqlalchemy.url'] = 'sqlite:///'+self.cfg['app']['db'] # merge/override appConfig with custom settings in cfg self.app_settings.update(self.cfg['app']['appSettings']) # merge/override appConfig with individual custom settings self.app_settings.update(customAppSettings) # app engine = engine_from_config(self.app_settings) DBSession.configure(bind=engine) Base.metadata.create_all(engine) from c3smembership import main app = main({}, **self.app_settings) # create srv if wrapper == 'StopableWSGIServer': self.srv = StopableWSGIServer.create( app, host=self.cfg['app']['host'], port=self.cfg['app']['port'] ) # check srv if not self.srv.wait(): raise Exception('Server could not be fired up. Exiting ...') elif wrapper == 'TestApp': self.srv = TestApp(app) else: raise Exception('Wrapper could not be found. Exiting ...') # store some variables self.srv.db = DBSession self.srv.url = 'http://' + self.cfg['app']['host'] + ':' \ + self.cfg['app']['port'] + '/' return self.srv
def set_reference_code(cls, shares_id, reference_code): """ Sets the reference code of the shares package. Args: shares_id: The technical primary key of the shares package for which the payment confirmation is set. reference_code: The reference code which is set. """ # pylint: disable=no-member shares = DBSession.query(Shares).filter(Shares.id == shares_id).first() shares.reference_code = reference_code
def get(cls, shares_id): """ Gets the shares package for the specified shares id. Args: shares_id: The technical primary key of the shares package for which the payment confirmation is set. Returns: The shares package for the specified shares id. """ # pylint: disable=no-member return DBSession.query(Shares).filter(Shares.id == shares_id).first()
def make_member_with_shares2(self): with transaction.manager: member1 = C3sMember( # german firstname=u'SomeFirstnäme', lastname=u'SomeLastnäme', email=u'*****@*****.**', address1=u"addr one", address2=u"addr two", postcode=u"12345", city=u"Footown Mäh", country=u"Foocountry", locale=u"DE", date_of_birth=date.today(), email_is_confirmed=False, email_confirm_code=u'ABCDEFGFOO', password=u'arandompassword', date_of_submission=date.today(), membership_type=u'normal', member_of_colsoc=True, name_of_colsoc=u"GEMA", num_shares=u'23', ) shares1 = Shares( number=2, date_of_acquisition=date.today(), reference_code=u'ABCDEFGH', signature_received=True, signature_received_date=date(2014, 6, 7), payment_received=True, payment_received_date=date(2014, 6, 8), signature_confirmed=True, signature_confirmed_date=date(2014, 6, 8), payment_confirmed=True, payment_confirmed_date=date(2014, 6, 9), accountant_comment=u'no comment', ) member1.shares = [shares1] DBSession.add(member1) DBSession.add(shares1)
def get_member(cls, membership_number): """ Gets the member of the specified membership number. Args: membership_number: The membership number of the member which is returned. Returns: The membership of the specified membership number. """ # pylint: disable=no-member return DBSession.query(C3sMember).filter( C3sMember.membership_number == membership_number).first()
def test_set_reference_code(self): """ Tests the ShareRepository.set_reference_code method. """ # pylint: disable=no-member member1 = DBSession.query(C3sMember).filter( C3sMember.membership_number == 'member1').first() shares = member1.shares[0] ShareRepository.set_reference_code(shares.id, u'test_reference_code') self.assertEqual(shares.reference_code, u'test_reference_code') ShareRepository.set_reference_code(shares.id, None) self.assertEqual(shares.reference_code, None)
def _initTestingDB(): # from sqlalchemy import create_engine # from c3smembership.models import initialize_sql # session = initialize_sql(create_engine('sqlite:///memory')) # session = DBSession my_settings = { 'sqlalchemy.url': 'sqlite:///:memory:', } engine = engine_from_config(my_settings) DBSession.configure(bind=engine) Base.metadata.create_all(engine) with transaction.manager: member1 = C3sMember( # german firstname=u'SomeFirstnäme', lastname=u'SomeLastnäme', email=u'*****@*****.**', address1=u"addr one", address2=u"addr two", postcode=u"12345", city=u"Footown Mäh", country=u"Foocountry", locale=u"de", date_of_birth=date.today(), email_is_confirmed=False, email_confirm_code=u'ABCDEFGFOO', password=u'arandompassword', date_of_submission=date.today(), membership_type=u'normal', member_of_colsoc=True, name_of_colsoc=u"GEMA", num_shares=u'23', ) member2 = C3sMember( # german firstname=u'AAASomeFirstnäme', lastname=u'XXXSomeLastnäme', email=u'*****@*****.**', address1=u"addr one", address2=u"addr two", postcode=u"12345", city=u"Footown Mäh", country=u"Foocountry", locale=u"en", date_of_birth=date.today(), email_is_confirmed=False, email_confirm_code=u'ABCDEFGBAR', password=u'arandompassword', date_of_submission=date.today(), membership_type=u'normal', member_of_colsoc=True, name_of_colsoc=u"GEMA", num_shares=u'23', ) DBSession.add(member1) DBSession.add(member2) return DBSession
def get_member_by_id(cls, member_id): """ Gets the member of the specified member ID. TODO: The member ID is a database internal ID and must not be exposed from the data layer. Therefore, the implementation must be adjusted to use the get_member method using the membership number. Args: member_id: The technical ID of the member which is returned. Returns: The membership of the specified member id. """ # pylint: disable=no-member return DBSession.query(C3sMember).filter( C3sMember.id == member_id).first()
def get_member_shares(cls, membership_number): """ Gets the share of a members. Args: membership_number: The membership number of the member of which the shares are returned. Returns: The shares of the member. """ # pylint: disable=no-member return DBSession.query(Shares) \ .join(members_shares) \ .join(C3sMember) \ .filter(C3sMember.membership_number == membership_number) \ .all()
def get_approved(cls, start_date, end_date): """ Gets all shares approved between and including both start date and end date. Args: start_date: The first date for which approved shares are returned. end_date: The last date for which approved shares are returned. Returns: All shares approved between and including both start date and end date. """ # pylint: disable=no-member return DBSession.query(Shares).filter( expression.and_( Shares.date_of_acquisition >= start_date, Shares.date_of_acquisition <= end_date)).all()
def set_payment_confirmation(cls, shares_id, confirmation_date=None): """ Sets the payment confirmation of the shares package. Args: shares_id: The technical ID of the shares package for which the payment confirmation is set. confirmation_date: Optional. The payment confirmation date which is set. If not specified the payment confirmation date is unset. """ # pylint: disable=no-member shares = DBSession.query(Shares).filter(Shares.id == shares_id).first() shares.payment_confirmed_date = confirmation_date shares.payment_confirmed = \ confirmation_date is not None \ and \ confirmation_date > date(1970, 1, 1)
def _accepted_members_query(cls, effective_date=None): """ Gets the query to retrieve members accepted until and including the specified effective date. Args: effective_date: Optional. The date on which the membership has been accepted. If not specified system date is used as effective date. Returns: The query to retrieve members accepted until and including the specified effective date. """ # pylint: disable=no-member all_members_query = DBSession.query(C3sMember) accepted_members_query = cls._filter_accepted_member( all_members_query, effective_date) return accepted_members_query
def set_signature_confirmation(cls, shares_id, confirmation_date=None): """ Sets the signature reception date. Args: shares_id: The technical ID of the shares package for which the signature reception date is set. confirmation_date: Optional. The signature confirmation date to be set to the share process. If not specified the signature confirmation date is unset. """ # pylint: disable=no-member shares = DBSession.query(Shares).filter(Shares.id == shares_id).first() shares.signature_confirmed_date = confirmation_date shares.signature_confirmed = ( confirmation_date is not None and confirmation_date > date(1970, 1, 1) )