Пример #1
0
 def build_company_from_dataclass(self, company_dc: CompanyDC) -> Company:
     return Company(
         name=company_dc.name,
         symbol=company_dc.symbol,
         info=self._company_info_factory.build_company_info(
             company_dc.info),
     )
Пример #2
0
    def process_company(self, company_id, company_ipn, company_name):
        if not company_ipn and not company_name:
            return None

        if len(company_name) > 250:
            self.stderr.write(
                'Company name {} is too long'.format(company_name))
            return None

        company = None

        for k, v in [("pk", company_id), ("edrpou", company_ipn),
                     ("name_uk", company_name)]:
            try:
                if v:
                    company = Company.objects.get(**{k: v})
                    break
            except Company.DoesNotExist:
                pass

        if company is None:
            company = Company(state_company=True)

        # Set missing params
        if not company.name_uk:
            company.name_uk = company_name

        Ua2EnDictionary.objects.get_or_create(term=lookup_term(company_name))

        if not company.edrpou:
            company.edrpou = company_ipn

        company.save()
        return company
Пример #3
0
 def test_company_str(self):
     """Tests the company string representation"""
     company = Company(
         index=11,
         company='ACME Inc'
     )
     company.save()
     assert Company.objects.get(index=11).company == company.company
Пример #4
0
 def setUp(self):
     super().setUp()
     self.client = Client(schema)
     # Populate the test collectiom with person data
     with open("core/tests/test_data/employees.json") as employee_json:
         employees = json.load(employee_json)
         for employee in employees:
             employee_obj = Person(**employee)
             employee_obj.save()
     # Populate the test collection with company data
     with open("core/tests/test_data/companies.json") as companies_json:
         companies = json.load(companies_json)
         for companies in companies:
             companies_obj = Company(**companies)
             companies_obj.save()
Пример #5
0
    def import_companies(self):
        """
        This method is used for read in parser file the fields referring a
        companies and create the objects of companies.
        """
        csv_file = self.read_file('importer/data/companies.csv')

        print('Importing Companies...')
        for row in csv_file:
            try:
                Company.objects.get(name=row[0])
                print('Company', row[0], 'already registered.')
            except ObjectDoesNotExist:
                company = Company()
                company.name = row[0]
                company.save()
Пример #6
0
    def handle(self, *args, **options):
        print('Deleting all existing records')
        Company.objects.all().delete()

        path = options['dataset']
        keys = [f.name for f in Company._meta.fields]

        with open(path, mode='r', encoding='utf-8') as file_handler:
            for row in csv.DictReader(file_handler):
                filtered = {k: v for k, v in row.items() if k in keys}
                obj = Company(**filtered)
                obj.save()

                for ticker in self.extract_tickers(row):
                    obj.tickers.create(code=ticker)

        print('{:,} objects created'.format(Company.objects.count()))
Пример #7
0
def manage_company(request, company_id=None):
    if request.user.is_superuser:
        # Try to locate the object to use it as an instance and if not, create
        # new one to use it in a new form.
        # common_data = common_ticket_data()
        if company_id:
            actual_company = get_object_or_404(Company, pk=company_id)
        else:
            actual_company = Company()
        # POST mode
        if request.method == 'POST':
            form = CompanyForm(request.POST, request.FILES, instance=actual_company)
            if form.is_valid():
                form.save()
                return redirect('company-list')
        else:
            # Non-POST mode, show only
            form = CompanyForm(instance=actual_company)
        return render(request, 'core/companies/create_edit_company.html', locals())
    else:
        raise Http404
Пример #8
0
    def bulk_update(self, batch=False):
        # ToDo: Benchmarktest, I do not know if that approach scales
        # maybe work with batch size, if 500 values in a dict, insert it and clear it

        # Either clear & insert the lists if we check for batch size
        # or clear & insert the lists if we force it
        # Normally a batch run happens during the order check after every order
        # so the data does not get to full
        # A force insert happens when all orders have been matched
        # and we want to insert the rest

        if not batch or len(self.depot_positions_create) > self.BATCH:
            l = list()
            for key in self.depot_positions_create:
                v = self.depot_positions_create[key]
                l.append(
                    DepotPosition(depot_of_id=key[0],
                                  company_id=key[1],
                                  amount=v))

            DepotPosition.objects.bulk_create(l)
            self.depot_positions_create = dict()

        if not batch or len(self.depot_positions_update) > self.BATCH:

            for key in self.depot_positions_update:
                v = self.depot_positions_update[key]
                DepotPosition.objects.filter(
                    depot_of_id=key[0],
                    company_id=key[1]).update(amount=F("amount") + v)

            self.depot_positions_update = dict()

        # activity
        if not batch or len(self.activity_update) > self.BATCH:
            list_ = [v for k, v in self.activity_update.items()]
            Activity.objects.filter(id__in=list_).update(
                updated=timezone.now())
            self.activity_update = dict()

        # update cash of companies
        if not batch or len(self.companies_cash_update) > self.BATCH:
            l = list()
            for k, v in self.companies_cash_update.items():
                obj = Company(id=k, cash=F("cash") + v)
                l.append(obj)
                # Company.objects.filter(id=k).update(cash=F("cash")+v)

            Company.objects.bulk_update(l, ["cash"])
            self.companies_cash_update = dict()

        # delete Orders
        if not batch or len(self.order_ids_delete) > self.BATCH:
            Order.objects.filter(id__in=self.order_ids_delete).delete()
            self.order_ids_delete = list()

        if not batch or len(self.order_update) > self.BATCH:
            l = list()
            for k in self.order_update:
                obj = Order(id=k, amount=self.order_update[k])
                l.append(obj)
            Order.objects.bulk_update(l, fields=["amount"])

        # delete Positions
        if not batch:
            DepotPosition.objects.filter(amount=0).delete()

        # create trades and statement of acounts
        # For performance reason we use bulk_creates to save queries.
        # There is just a slight problem regarding the trades and the statement of accounts:
        # We want to save the trade id of the related trade in the statement of account.
        # So we create the trades first, then retrieve their ids and set them in the statement
        # of account objects before inserting them in the database.
        #
        # As we are using postgresql as our database it supports the setting of the id
        # field of objects during bulk_create. Postgresql the greatest database of all time!!!
        if not batch or len(self.trades) > self.BATCH or len(
                self.statements) > self.BATCH:
            Trade.objects.bulk_create(self.trades)

            i = 0
            for trade in self.trades:

                # For every trade there are 2 statement of accounts:
                # One for the buyer & one for the seller.
                self.statements[i].trade = trade
                self.statements[i + 1].trade = trade

                fst_statement = self.statements[i]
                snd_statement = self.statements[i + 1]

                if fst_statement.value != snd_statement.value or fst_statement.amount != snd_statement.amount:
                    raise ValueError(
                        f"Statement did not match: {fst_statement} {snd_statement}"
                    )

                if trade.get_value() != fst_statement.value:
                    raise ValueError(
                        f"Trade {trade} does not match statement: {fst_statement}"
                    )

                if trade.get_value() != snd_statement.value:
                    raise ValueError(
                        f"Trade {trade} does not match statement: {snd_statement}"
                    )

                i += 2

            for statement in self.statements:
                assert statement.trade is not None

            StatementOfAccount.objects.bulk_create(self.statements)

            self.statements = list()
            self.trades = list()

        if not batch or len(self.notifications) > self.BATCH:
            Notification.objects.bulk_create(self.notifications)
            # for obj in self.notifications:
            #     e = Event(user_id=obj.user_id, typ="Order", msg=obj.subject)
            #     store_event(e)

            self.notifications = list()
Пример #9
0
    def get_or_create_from_edr_record(self, obj_dict, save=True):
        """
        Kind of get_or_create method, to create or update company model
        instance using data from EDR.

        Returns Company instance and a created flag
        """
        created = False

        edrpou = unicode(obj_dict["edrpou"]).rjust(8, "0")

        if not obj_dict["edrpou"]:
            self.logger.error(
                "Не можу імпортувати юр. особу без ЄДРПОУ <%s>" %
                json.dumps(obj_dict, ensure_ascii=False, default=str))
            return None, created

        parsed = parse_address(obj_dict["location"])

        # Not using get_or_create to avoid situation
        # when created object is saved immediately
        try:
            # Sometime in companies table we have more than one company
            # with same edrpou, that usually happens when company got
            # reorganized or resurrected or something else strange had
            # happened

            # Here we'll try to update the most record of the company
            # in business first by narrowing down the search by using
            # status field
            company = Company.objects.get(edrpou=edrpou, status=1)
        except Company.DoesNotExist:
            try:
                company = Company.objects.get(edrpou=edrpou)
            except Company.DoesNotExist:
                company = Company(edrpou=edrpou,
                                  name_uk=obj_dict["name"].strip(),
                                  short_name_uk=obj_dict.get("short_name",
                                                             "").strip())
                created = True
            except Company.MultipleObjectsReturned:
                self.logger.error(
                    "Не можу імпортувати юр. особу <%s>: в базі таких більше одної"
                    % json.dumps(obj_dict, ensure_ascii=False, default=str))
                return None, created

        except Company.MultipleObjectsReturned:
            self.logger.error(
                "Не можу імпортувати юр. особу <%s>: в базі більше одної в статусі 'зареєстровано'"
                % json.dumps(obj_dict, ensure_ascii=False, default=str))
            return None, created

        if parsed:
            zip_code, city_uk, street_uk, appt_uk = parsed
            update_dict = {
                "zip_code": zip_code,
                "city_uk": city_uk,
                "street_uk": street_uk,
                "appt_uk": appt_uk
            }
        else:
            update_dict = {"raw_address": obj_dict["location"]}

        if "founded" in obj_dict:
            update_dict = {"founded": obj_dict["founded"]}

        for k, v in company._status_choices.items():
            if obj_dict["status"].lower() == v:
                update_dict["status"] = k
                break

        merger = st.Merger((
            ("^status$", st.replace_strategy),
            (".*", st.replace_if_empty_strategy),
        ))

        res = merger.merge(company, update_dict)

        for k, v in res.items():
            if v == st.MergeResult.OLD_VALUE:
                self.logger.warning(
                    "Не замінюю поле %s на %s для компанії %s, %s" %
                    (k, update_dict[k], company.name, company.id))

        if save:
            company.save()

        return company, created
Пример #10
0
    def get_or_create_from_unified_foreign_registry(self, obj_dict, save=True):
        """
        Kind of get_or_create method, to create or update company model
        instance using data from spreadsheet rows of unified format below:
        owner_name, company_name_declaration, company_name_en, zip, city, street,
        appt, country, company_code, status, notes, company_name_orig, link,
        founder_1,... founder_N

        Lookup for get is made using company_code (if present).
        If company_code is absent or no match is found, lookup is made by name

        Returns Company instance and a created flag
        """
        created = False

        company_code = obj_dict["company_code"].strip().replace(" ", "")
        company_name_declaration = obj_dict["company_name_declaration"].strip()
        company_name_en = obj_dict["company_name_en"].strip()
        company_name_orig = obj_dict["company_name_orig"].strip()

        if obj_dict["country"].strip().lower() == "кіпр":
            company_code = re.sub("^HE\s?", "HE", company_code)
            company_code = re.sub("^ΗΕ\s?", "HE", company_code)
            company_code = re.sub("^H\.E\.\s?", "HE", company_code)
            company_code = re.sub("^Η\.E\.\s?", "HE", company_code)

        update_dict = {
            "zip_code": obj_dict["zip"].strip(),
            "city_uk": obj_dict["city"].strip(),
            "street_uk": obj_dict["street"].strip(),
            "appt_uk": obj_dict["appt"].strip(),
            "city_en": obj_dict["city"].strip(),
            "street_en": obj_dict["street"].strip(),
            "appt_en": obj_dict["appt"].strip(),
        }

        if any(v for k, v in obj_dict.items() if k.startswith("founder_")):
            update_dict["other_founders_uk"] = "\n".join(
                obj_dict[k] for k in sorted(obj_dict.keys())
                if k.startswith("founder_"))

        if obj_dict["notes"].strip():
            update_dict["wiki_uk"] = '<p>%s</p>' % obj_dict["notes"].strip()

        if obj_dict["link"].strip():
            update_dict["wiki_uk"] = (
                update_dict.get("wiki_uk", "") +
                '<p><a href="%s" target="_blank">Запис в реєстрі</p>' %
                obj_dict["link"].strip())
            update_dict["wiki_en"] = (
                update_dict.get("wiki_en", "") +
                '<p><a href="%s" target="_blank">Registry record</p>' %
                obj_dict["link"].strip())

        if company_name_orig:
            update_dict["also_known_as"] = company_name_orig

        if company_name_declaration:
            update_dict["name_uk"] = company_name_declaration

        if company_name_en:
            update_dict["name_en"] = company_name_en

        if obj_dict["status"]:
            for k, v in Company._status_choices.items():
                if obj_dict["status"].lower() == v:
                    update_dict["status"] = k
                    break
            else:
                self.logger.warning(
                    "Ігноруємо незрозумілий статус для компанії <%s>" %
                    json.dumps(obj_dict, ensure_ascii=False))

        if (not company_code and not company_name_declaration
                and not company_name_en and not company_name_orig):
            self.logger.error(
                "Не можу імпортувати іноземну юр. особу без коду або назви <%s>"
                % json.dumps(obj_dict, ensure_ascii=False))
            return None, created

        # Not using get_or_create to avoid situation
        # when created object is saved immediately
        try:
            # Search by code first
            company = Company.objects.deep_get([("edrpou__iexact",
                                                 company_code)])
        except (Company.DoesNotExist, Company.MultipleObjectsReturned):
            try:
                # Then refine the search if needed
                company = Company.objects.deep_get([
                    ("name_uk__iexact", company_name_declaration),
                    ("name_uk__iexact", company_name_en),
                    ("name_uk__iexact", company_name_orig),
                    ("name_en__iexact", company_name_declaration),
                    ("name_en__iexact", company_name_en),
                    ("name_en__iexact", company_name_orig)
                ])

                if (company.edrpou and company_code
                        and company.edrpou.lower() != company_code.lower()):
                    # We found a company by name, but it's probably a wrong one
                    self.logger.warning((
                        "Юр. особа що була знайдена для запису %s за іменем має відмінний "
                        + "код реєстрації: %s, створюємо нову компанію") %
                                        (json.dumps(obj_dict,
                                                    ensure_ascii=False),
                                         company.edrpou))
                    raise Company.DoesNotExist()

            except Company.DoesNotExist:
                company = Company(edrpou=company_code)
                created = True
            except Company.MultipleObjectsReturned:
                self.logger.error(
                    "Не можу імпортувати юр. особу <%s>: в базі таких більше одної"
                    % json.dumps(obj_dict, ensure_ascii=False))
                return None, created

        merger = st.Merger((
            ("name_uk", st.replace_strategy),
            ("name_en", st.replace_strategy),
            (".*", st.replace_if_empty_strategy),
        ))

        res = merger.merge(company, update_dict)

        for k, v in res.items():
            if v == st.MergeResult.OLD_VALUE:
                self.logger.warning(
                    "Не замінюю поле %s на %s для компанії %s, %s" %
                    (k, update_dict[k], company.name, company.id))

        if save:
            company.save()

        return company, created
Пример #11
0
 def test_company_required_field(self):
     company = Company()
     with self.assertRaises(ValidationError):
         company.full_clean()
Пример #12
0
 def test_company_name_required_field(self):
     company = Company(domain_name='instasalary.app')
     with self.assertRaises(ValidationError):
         company.full_clean()
Пример #13
0
 def test_company_domain_required_field(self):
     company = Company(name='abc')
     with self.assertRaises(ValidationError):
         company.full_clean()
Пример #14
0
    def post(self, request):
        name = request.data.get("name")
        description = request.data.get("description")
        phone = request.data.get("phone")
        address = request.data.get("address")
        available_now = request.data.get("availableNow")
        photo = request.data.get("image")
        limits = request.data.get("limits")
        category_description = request.data.get("category")
        limits = urllib.parse.unquote(limits.__str__())
        category_selected = CompanyCategory.objects.get(
            description=category_description)
        payment_array = []
        delivery_array = []

        if available_now.__str__() == "true" or available_now:
            available_now = True
        else:
            available_now = False
        try:
            payment_methods = request.data.get("paymentMethods").name
            payment_methods = payment_methods.replace('[', '')
            payment_methods = payment_methods.replace(']', '')
            payment_methods = payment_methods.split(',')
        except:
            payment_methods = request.data.get("paymentMethods")

        try:
            delivery_methods = request.data.get("deliveryMethods").name
            delivery_methods = delivery_methods.replace('[', '')
            delivery_methods = delivery_methods.replace(']', '')
            delivery_methods = delivery_methods.split(',')
        except:
            delivery_methods = request.data.get("deliveryMethods")

        try:
            comapny_from_user = request.user
            company = Company.objects.get(id_user=comapny_from_user)
        except:
            company = Company()
            company.account_debit = 0

        try:
            company.name = name
            company.description = description
            company.phone = phone
            company.address = address
            company.available_now = available_now
            if photo is not None:
                company.photo = photo
            company.limits = limits
            company.category = category_selected
            company.id_user = request.user
            company.save()
            for method in payment_methods:
                method = method.strip()
                method_selected = PaymentMethod.objects.get(description=method)
                payment_array.append(method_selected)
            company.payment_method.set(payment_array)

            for method in delivery_methods:
                method = method.strip()
                delivery_method_selected = DeliveryMethod.objects.get(
                    description=method)
                delivery_array.append(delivery_method_selected)
            company.delivery_method.set(delivery_array)

            company.save()
        except Exception():
            return Response({"Error Saving This"}, 400)

        return Response(company.pk)