From dab73dc4c197a8677d4e73b05ea0a315926e8af3 Mon Sep 17 00:00:00 2001 From: estromenko Date: Sun, 30 Nov 2025 14:30:34 +0300 Subject: [PATCH] Add external database with parser vacancies --- vacancies/conf/settings.py | 12 ++++++++++++ vacancies/hh_parser/__init__.py | 0 vacancies/hh_parser/admin.py | 14 ++++++++++++++ vacancies/hh_parser/apps.py | 6 ++++++ vacancies/hh_parser/models.py | 31 +++++++++++++++++++++++++++++++ vacancies/hh_parser/routers.py | 23 +++++++++++++++++++++++ 6 files changed, 86 insertions(+) create mode 100644 vacancies/hh_parser/__init__.py create mode 100644 vacancies/hh_parser/admin.py create mode 100644 vacancies/hh_parser/apps.py create mode 100644 vacancies/hh_parser/models.py create mode 100644 vacancies/hh_parser/routers.py diff --git a/vacancies/conf/settings.py b/vacancies/conf/settings.py index b9fb9d8..34c2cf6 100644 --- a/vacancies/conf/settings.py +++ b/vacancies/conf/settings.py @@ -43,6 +43,7 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'vacancies.main', + 'vacancies.hh_parser', ] MIDDLEWARE = [ @@ -89,8 +90,19 @@ DATABASES = { "PORT": os.getenv("PG_PORT", "5432"), "CONN_HEALTH_CHECKS": True, }, + "hh_parser": { + "ENGINE": "django.db.backends.postgresql", + "NAME": os.getenv("HH_PARSER_PG_NAME", "postgres"), + "USER": os.getenv("HH_PARSER_PG_USER", "postgres"), + "PASSWORD": os.getenv("HH_PARSER_PG_PASSWORD", "postgres"), + "HOST": os.getenv("HH_PARSER_PG_HOST", "localhost"), + "PORT": os.getenv("HH_PARSER_PG_PORT", "5432"), + "CONN_HEALTH_CHECKS": True, + }, } +DATABASE_ROUTERS = ["vacancies.hh_parser.routers.AppRouter"] + DB_URI = f"postgres://{DATABASES['default']['USER']}:{quote(DATABASES['default']['PASSWORD'])}@{DATABASES['default']['HOST']}:{DATABASES['default']['PORT']}/{DATABASES['default']['NAME']}?sslmode=disable" diff --git a/vacancies/hh_parser/__init__.py b/vacancies/hh_parser/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vacancies/hh_parser/admin.py b/vacancies/hh_parser/admin.py new file mode 100644 index 0000000..b85e624 --- /dev/null +++ b/vacancies/hh_parser/admin.py @@ -0,0 +1,14 @@ +from django.contrib import admin +from vacancies.hh_parser import models + + +@admin.register(models.Vacancy) +class VacancyAdmin(admin.ModelAdmin): + def has_add_permission(self, request): + return False + + def has_change_permission(self, request, obj=None): + return False + + def has_delete_permission(self, request, obj=None): + return False diff --git a/vacancies/hh_parser/apps.py b/vacancies/hh_parser/apps.py new file mode 100644 index 0000000..7367276 --- /dev/null +++ b/vacancies/hh_parser/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class HHParserConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'vacancies.hh_parser' diff --git a/vacancies/hh_parser/models.py b/vacancies/hh_parser/models.py new file mode 100644 index 0000000..ae6464c --- /dev/null +++ b/vacancies/hh_parser/models.py @@ -0,0 +1,31 @@ +from django.db import models + + +class Vacancy(models.Model): + id = models.CharField(max_length=255, primary_key=True) + title = models.CharField(max_length=255, null=True, blank=True) + description = models.TextField(null=True, blank=True) + min_payment = models.IntegerField(null=True, blank=True) + max_payment = models.IntegerField(null=True, blank=True) + payment_currency = models.CharField(max_length=255, null=True, blank=True) + payment_type = models.CharField(max_length=255, null=True, blank=True) + payment_period = models.CharField(max_length=255, null=True, blank=True) + work_experience = models.CharField(max_length=255, null=True, blank=True) + type_of_employment = models.CharField(max_length=255, null=True, blank=True) + work_schedule = models.CharField(max_length=255, null=True, blank=True) + work_format = models.CharField(max_length=255, null=True, blank=True) + link = models.CharField(max_length=255, null=True, blank=True) + address = models.CharField(max_length=255, null=True, blank=True) + created_at = models.DateTimeField(null=True, blank=True) + processed = models.BooleanField() + source = models.CharField() + + objects = models.Manager() + + def __str__(self): + return f'{self.source} -> {self.id} {self.title}' + + class Meta: + managed = False + db_table = "vacancies" + verbose_name_plural = 'Vacancies' diff --git a/vacancies/hh_parser/routers.py b/vacancies/hh_parser/routers.py new file mode 100644 index 0000000..b20ac68 --- /dev/null +++ b/vacancies/hh_parser/routers.py @@ -0,0 +1,23 @@ +class AppRouter: + route_app_labels = {"hh_parser"} + db_name = "hh_parser" + + def db_for_read(self, model, **hints): + if model._meta.app_label in self.route_app_labels: + return self.db_name + return None + + def db_for_write(self, model, **hints): + if model._meta.app_label in self.route_app_labels: + return self.db_name + return None + + def allow_relation(self, obj1, obj2, **hints): + if obj1._meta.app_label in self.route_app_labels and obj2._meta.app_label in self.route_app_labels: + return True + return None + + def allow_migrate(self, db, app_label, model_name=None, **hints): + if app_label in self.route_app_labels: + return db == self.db_name + return None