Esempio n. 1
0
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
Esempio n. 2
0
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)