예제 #1
0
 def members(self):
     _model = get_user_model()
     if not self.contract_address:
         return _model.objects.none()
     oracle = OracleHandler()
     members = oracle.get_company_members(self.contract_address)
     return _model.objects.filter(contract_address__in=members)
예제 #2
0
def facts(context, member):
    date_fields = ['date_from', 'date_up_to', 'date_of_receiving']
    args = {}
    if member.contract_address:
        oracle = OracleHandler()
        fact_keys = oracle.facts_keys(member.contract_address)
        facts_dict = []
        for item in fact_keys:
            fact = oracle.fact(member.contract_address, item)
            f = json.loads(fact[2])
            for date_item in date_fields:
                if date_item in f:
                    f[date_item] = date_converter.string_to_date(
                        f[date_item], current_format='%Y-%m-%dT%H:%M:%S')

            facts_dict.append({
                'id':
                item,
                'from':
                fact[0],
                'date':
                datetime.datetime.fromtimestamp(int(fact[1])),
                'fact':
                f
            })
        args['facts'] = facts_dict
        args['member'] = member
        context.update(args)
    return context
예제 #3
0
def new_member_instance(user_id):
    try:
        Member.objects.get(pk=user_id)
    except Member.DoesNotExist:
        logger.error('Member with id {} not found, contract will not be deployed.'.format(user_id))
    else:
        oracle = OracleHandler()
        w3 = utils.get_w3()
        contract_file = 'dapp/contracts/Member.sol'
        compile_sol = compile_files([contract_file, ],
                                    output_values=("abi", "ast", "bin", "bin-runtime",))
        create_abi(compile_sol[contract_file + ':Member']['abi'], 'Member')
        obj = w3.eth.contract(
            abi=compile_sol[contract_file + ':Member']['abi'],
            bytecode=compile_sol[contract_file + ':Member']['bin'],
            bytecode_runtime=compile_sol[contract_file + ':Member']['bin-runtime'],
        )
        args = [settings.VERA_ORACLE_CONTRACT_ADDRESS, ]
        logger.info('Try to unlock account: {}.'.format(oracle.unlockAccount()))
        try:
            txn_hash = obj.deploy(transaction={'from': oracle.account}, args=args)
        except Exception as e:
            logger.warning('Error while deploy new member contract. User {}: {}'.format(user_id, e))
            return False
        else:
            logger.info('Lock account: {}'.format(oracle.lockAccount()))
            save_txn.delay(txn_hash.hex(), 'NewMember', user_id, user_id)
            save_txn_to_history.delay(user_id, txn_hash.hex(),
                                      'Creation of a new Member contract')
예제 #4
0
def candidate_level_up(vacancy_id, candidate_id):
    try:
        vacancy = Vacancy.objects.get(pk=vacancy_id)
        candidate = Member.objects.get(pk=candidate_id)
    except Vacancy.DoesNotExist:
        logger.warning(
            'Vacancy {} not found, candidate will not be leveled up.'.format(
                vacancy_id))
        return False
    except Member.DoesNotExist:
        logger.warning(
            'Member {} not found and will not be leveled up.'.format(
                candidate_id))
        return False
    else:
        oracle = OracleHandler()
        try:
            txn_hash = oracle.level_up(vacancy.company.contract_address,
                                       vacancy.uuid,
                                       candidate.contract_address)
        except Exception as e:
            logger.error(
                'Error auto level up member {} on vacancy {}: {}'.format(
                    candidate_id, vacancy_id, e))
            return False
        else:
            save_txn_to_history.delay(
                candidate_id, txn_hash.hex(),
                'Level up on vacancy {}'.format(vacancy.title))
        return True
예제 #5
0
 def post(self, request, *args, **kwargs):
     oracle = OracleHandler()
     old_status = oracle.member_status(request.user.contract_address,
                                       only_index=True)
     new_status = int(request.POST.get('status'))
     if new_status != old_status:
         change_member_status.delay(request.user.id, new_status)
     return super().get(request, *args, **kwargs)
예제 #6
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
예제 #7
0
def may_apply_vacancy(member, vacancy):
    if not member.contract_address:
        return False
    oracle = OracleHandler()
    current_action_index = oracle.get_member_current_action_index(
        vacancy.company.contract_address, vacancy.uuid,
        member.contract_address)
    already_subscribed = MemberOnVacancy.objects.filter(
        member=member, vacancy=vacancy).exists()
    return current_action_index == -1 and not already_subscribed
예제 #8
0
 def dispatch(self, request, *args, **kwargs):
     self.action = get_object_or_404(Action, pk=kwargs.get('pk', None))
     vacancy = self.action.pipeline.vacancy
     oracle = OracleHandler()
     mci = oracle.get_member_current_action_index(
         vacancy.company.contract_address, vacancy.uuid,
         request.user.contract_address)
     if mci != self.action.index:
         raise Http404
     return super().dispatch(request, *args, **kwargs)
예제 #9
0
 def get_context_data(self, **kwargs):
     context = super().get_context_data(**kwargs)
     context['action'] = self.action_exam.action
     context['candidate'] = self.candidate
     oracle = OracleHandler()
     vacancy = self.action_exam.action.pipeline.vacancy
     mci = oracle.get_member_current_action_index(
         vacancy.company.contract_address, vacancy.uuid,
         self.candidate.contract_address)
     mci == self.action_exam.action.index and context.update(
         {'not_yet': True})
     return context
예제 #10
0
def deploy_new_company(company_id):
    """
    Deploy new company contract
    :param company_id: Company off chain id for deploy
    :return: True in case of successful, false otherwise
    """
    try:
        instance = Company.objects.get(pk=company_id)
    except Company.DoesNotExist:
        logger.error(
            'Company with id {} not found, contract will bot be deployed.'.
            format(company_id))
        return False
    else:
        oracle = OracleHandler()
        w3 = utils.get_w3()
        contract_file = 'dapp/contracts/Company.sol'
        compile_sol = compile_files([
            contract_file,
        ],
                                    output_values=(
                                        "abi",
                                        "ast",
                                        "bin",
                                        "bin-runtime",
                                    ))
        create_abi(compile_sol[contract_file + ':Company']['abi'], 'Company')
        obj = w3.eth.contract(
            abi=compile_sol[contract_file + ':Company']['abi'],
            bytecode=compile_sol[contract_file + ':Company']['bin'],
            bytecode_runtime=compile_sol[contract_file +
                                         ':Company']['bin-runtime'],
        )
        args = [
            settings.VERA_COIN_CONTRACT_ADDRESS,
            settings.VERA_ORACLE_CONTRACT_ADDRESS,
        ]
        logger.info('Try to unlock account: {}.'.format(
            oracle.unlockAccount()))
        try:
            txn_hash = obj.deploy(transaction={'from': oracle.account},
                                  args=args)
        except Exception as e:
            logger.warning(
                'Error while deploy new company contract. Company {}: {}'.
                format(company_id, e))
        else:
            logger.info('Lock account: {}'.format(oracle.lockAccount()))
            save_txn.delay(txn_hash.hex(), 'NewCompany',
                           instance.created_by.id, company_id)
            save_txn_to_history.delay(instance.created_by.id, txn_hash.hex(),
                                      'Creation of a new Company contract')
예제 #11
0
def member_status(context, member, for_change=False):
    oracle = OracleHandler()
    status = oracle.member_status(member.contract_address)
    return {
        'statuses': [{
            'id': i,
            'status': v
        } for i, v in enumerate(oracle.statuses)],
        'status': status,
        'for_change': for_change,
        'now_pending':
        context['txns'].filter(txn_type='ChangeStatus').exists()
    }
예제 #12
0
def candidate_pass_exam(sender, instance, created, **kwargs):
    if created or not instance.processed:
        pr = ProcessExam()
        pr.delay(instance.id)
    else:
        if instance.processed and instance.points >= instance.exam.passing_grade:
            oracle = OracleHandler()
            vacancy = instance.exam.action.pipeline.vacancy
            cci = oracle.get_member_current_action_index(
                vacancy.company.contract_address, vacancy.uuid,
                instance.candidate.contract_address)
            if cci == instance.exam.action.index:
                if not instance.exam.action.chain.approvable:
                    candidate_level_up.delay(vacancy.id, instance.candidate.id)
예제 #13
0
 def verify(self):
     """
     Verify user
     :return: txn_hash in hex object
     """
     return self.contract_address and OracleHandler().verify_member(
         self.contract_address)
예제 #14
0
 def verified(self):
     """
     Is member verified in system
     :return: bool
     """
     return self.contract_address and OracleHandler().member_verified(
         self.contract_address)
예제 #15
0
def is_member_verify_fact(sender_address, member_address, fact_id, txns):
    transact_now = False
    for item in txns:
        if item.obj_id == fact_id:
            transact_now = True
    return transact_now or OracleHandler().member_fact_confirmations(
        sender_address, member_address, fact_id)
예제 #16
0
 def vacancies(self):
     """
     Filter for vacancies member subscribed to
     :return: Vacancies QuerySet
     """
     _model = ContentType.objects.get(model='vacancy')
     if not self.contract_address:
         return _model.model_class().objects.none()
     vac_set = set()
     oracle = OracleHandler()
     vac_length = oracle.member_vacancies_length(self.contract_address)
     for i in range(vac_length):
         vac_uuid = oracle.member_vacancy_by_index(self.contract_address, i)
         vac_set.add(vac_uuid)
     vacancies = _model.model_class().objects.filter(uuid__in=vac_set)
     return vacancies
예제 #17
0
 def candidates(self):
     """
     Filter for members subscribed to vacancy
     :return: Members QuerySet
     """
     members = OracleHandler().get_members_on_vacancy(self.company.contract_address, self.uuid)
     return get_user_model().objects.filter(contract_address__in=[i['contract_address'] for i in members])
예제 #18
0
 def is_already_verify_fact(self, member_address, fact_id):
     """
     Returns true if current user already verify member fact
     :param member_address: Member fact verified for
     :param fact_id: fact id
     :return: bool
     """
     return OracleHandler().member_fact_confirmations(
         self.contract_address, member_address, fact_id)
예제 #19
0
 def current_action_index(self, vacancy):
     """
     Get member current action number for given vacancy
     :param vacancy: vacancy to find action number
     :return: int (action number) or -1 (not subscribed to vacancy)
     """
     return OracleHandler().get_member_current_action_index(
         vacancy.company.contract_address, vacancy.uuid,
         self.contract_address)
예제 #20
0
 def chain(self):
     if not self.published:
         return None
     if self.pipeline:
         if self.pipeline.vacancy:
             vacancy = self.pipeline.vacancy
             return OracleHandler().get_action(
                 vacancy.company.contract_address, vacancy.uuid, self.index)
     return None
예제 #21
0
 def companies(self):
     """
     Filter for companies member is in.
     :return: Companies QuerySet
     """
     _model = ContentType.objects.get(model='company')
     if not self.contract_address:
         return _model.model_class().objects.none()
     companies = OracleHandler().get_member_companies(self.contract_address)
     return _model.model_class().objects.filter(
         contract_address__in=companies)
예제 #22
0
class CompaniesView(ListView):
    model = Company

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.request = None
        self.oracle = OracleHandler()

    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
        return super(CompaniesView, self).dispatch(request, *args, **kwargs)

    def get_queryset(self):
        qs = super().get_queryset()
        companies = self.oracle.get_member_companies(
            self.request.user.contract_address)
        return qs.filter(contract_address__in=companies)
예제 #23
0
def change_member_status(member_id, status):
    try:
        member = Member.objects.get(pk=member_id)
    except Member.DoesNotExist:
        logger.warning('Member {} not found. Status will not be changed.')
        return False
    else:
        mi = MemberInterface(contract_address=member.contract_address)
        try:
            txn_hash = mi.change_status(status)
        except Exception as e:
            logger.error('Error while change member {} status: {}'.format(
                member_id, e))
            return False
        else:
            save_txn.delay(txn_hash.hex(), 'ChangeStatus', member_id,
                           member_id)
            save_txn_to_history.delay(
                member_id, txn_hash.hex(), 'Status changed to {}'.format(
                    OracleHandler().statuses[int(status)]))
        return True
예제 #24
0
 def chain(self):
     return OracleHandler().vacancy(self.company.contract_address, self.uuid)
예제 #25
0
 def chain_allowed_amount(self):
     return OracleHandler().vacancy(self.company.contract_address, self.uuid)['allowed_amount'] / 10 ** 18
예제 #26
0
def members_length(address):
    oracle = OracleHandler()
    return oracle.get_company_members_length(address)
예제 #27
0
 def __init__(self, **kwargs):
     super().__init__(**kwargs)
     self.request = None
     self.oracle = OracleHandler()
예제 #28
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)
예제 #29
0
 def __init__(self):
     self.w3 = Web3(HTTPProvider(settings.NODE_URL))
     self.oracle = OracleHandler()
     self.txn_set = None
예제 #30
0
 def job_status(self):
     return OracleHandler().member_status(self.contract_address,
                                          only_index=True)