def change_status(vacancy_id, member_id): try: sender = Member.objects.get(pk=member_id) except Member.DoesNotExist: logger.warning( 'Member {} not found, vacancy status will not be changed'.format( member_id)) else: try: vacancy = Vacancy.objects.get(pk=vacancy_id) except Vacancy.DoesNotExist: logger.warning('Vacancy {} does not exist'.format(vacancy_id)) else: oracle = OracleHandler() allowed_for_vacancies = 0 company = vacancy.company for vacancy_item in company.vacancies.all(): allowed_for_vacancies += oracle.vacancy( company.contract_address, vacancy_item.uuid)['allowed_amount'] mi = MemberInterface(contract_address=sender.contract_address) try: mi.approve_company_tokens(company.contract_address, 0) txn_hash = mi.approve_company_tokens(company.contract_address, allowed_for_vacancies) except Exception as e: logger.warning('Cannot approve company tokens: {}'.format(e)) else: save_txn_to_history.delay( member_id, txn_hash.hex(), 'Approving {} tokens for platform'.format( allowed_for_vacancies / 10**18)) bch_vacancy = oracle.vacancy(vacancy.company.contract_address, vacancy.uuid) if bch_vacancy['enabled']: method = getattr(mi, 'disable_vac') else: method = getattr(mi, 'enable_vac') try: txn_hash = method(company.contract_address, vacancy.uuid) except Exception as e: logger.warning('Cant change vacancy {} status: {}'.format( vacancy.id, e)) else: save_txn_to_history.apply_async( args=(member_id, txn_hash.hex(), 'Vacancy status changed: {}'.format( vacancy.title)), countdown=0.1) save_txn.apply_async(args=(txn_hash.hex(), 'VacancyChange', member_id, vacancy.id), countdown=0.1) return True
class CheckTransaction(Task): name = 'CheckTransaction' soft_time_limit = 10 * 60 def __init__(self): self.w3 = Web3(HTTPProvider(settings.NODE_URL)) self.oracle = OracleHandler() self.txn_set = None def run(self, *args, **kwargs): self.txn_set = Transaction.objects.all() if len(self.txn_set): self.process_txns() return True def process_txns(self): for txn in self.txn_set: txn_info = self.w3.eth.getTransaction(txn.txn_hash) if txn_info is not None and txn_info['blockNumber'] is not None: self.handle_txn(txn) def check_txn_status(self, txn): receipt = self.w3.eth.getTransactionReceipt(txn.txn_hash) return receipt['status'] def handle_txn(self, txn): if txn.txn_type.lower() in DELETE_ONLY_TXN: self.delete_txn(txn) return True if hasattr(self, txn.txn_type.lower()): method = getattr(self, txn.txn_type.lower()) method(txn) def get_receipt(self, txn_hash): return self.w3.eth.getTransactionReceipt(txn_hash) def delete_txn(self, txn): try: txn.delete() except AssertionError: pass def newmember(self, txn): try: member = Member.objects.get(id=txn.obj_id) except Member.DoesNotExist: txn.delete() else: tnx_receipt = self.get_receipt(txn.txn_hash) member.contract_address = tnx_receipt['contractAddress'] member.save() self.delete_txn(txn) print("New Member contract: {} {}".format(member.full_name, tnx_receipt['contractAddress'])) def newcompany(self, txn): try: company = Company.objects.get(id=txn.obj_id) except Company.DoesNotExist: logger.warning('Company with id {} not found. Member will not be added as company owner'.format(txn.obj_id)) txn.delete() else: tnx_receipt = self.get_receipt(txn.txn_hash) company.contract_address = tnx_receipt['contractAddress'] company.save() oi = CompanyInterface(contract_address=tnx_receipt['contractAddress']) txn_hash = oi.new_owner_member(company.created_by.contract_address) save_txn_to_history.delay(company.created_by.id, txn_hash.hex(), 'Setting your member address as company owner') self.delete_txn(txn) print("New Company contract: {} {}".format(company.name, tnx_receipt['contractAddress'])) def newvacancy(self, txn): try: vac_o = Vacancy.objects.get(id=txn.obj_id) except Vacancy.DoesNotExist: pass else: vac_o.published = True vac_o.save() self.delete_txn(txn) print("NewVacancy: " + vac_o.title + ' ' + vac_o.uuid) def newaction(self, txn): try: act_o = Action.objects.get(pk=txn.obj_id) except Action.DoesNotExist: pass else: act_o.published = True act_o.save() self.delete_txn(txn) print("New action added: {}".format(act_o.id)) def vacancychange(self, txn): try: vac_o = Vacancy.objects.get(pk=txn.obj_id) except Vacancy.DoesNotExist: pass else: vac_o.enabled = self.oracle.vacancy(vac_o.company.contract_address, vac_o.uuid)['enabled'] vac_o.save() txn.delete() def actiondeleted(self, txn): try: act_o = Action.objects.get(pk=txn.obj_id) except Action.DoesNotExist: pass else: Action.objects.filter(pipeline=act_o.pipeline, index__gt=act_o.index).update(index=F('index') - 1) act_o.delete() self.delete_txn(txn)