Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,11 @@ DATABASE_PASSWORD="password"
DATABASE_PORT="5432"
DATABASE_HOST="db"
DATABASE_ENGINE="postgresql"

#SUPERJOB_KEY=
#TELEGRAM_SESSION=
#TELEGRAM_API_ID=
#TELEGRAM_API_HASH=
#TELEGRAM_API_TOKEN=

#DATABASE_URL="postgresql://postgres:password@localhost:5432/postgres"
4 changes: 2 additions & 2 deletions app/services/account/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@


class AccountConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app.services.account'
default_auto_field = "django.db.models.BigAutoField"
name = "app.services.account"
4 changes: 2 additions & 2 deletions app/services/auth/github/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@


class GithubConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app.services.auth.github'
default_auto_field = "django.db.models.BigAutoField"
name = "app.services.auth.github"
4 changes: 2 additions & 2 deletions app/services/auth/yandex_id/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@


class YandexIdConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app.services.auth.yandex_id'
default_auto_field = "django.db.models.BigAutoField"
name = "app.services.auth.yandex_id"
4 changes: 2 additions & 2 deletions app/services/foragencies/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

@admin.register(AgencyPricingPlan)
class AgencyPricingPlanAdmin(admin.ModelAdmin):
list_display = ("name", "price", "currency", 'period', "is_active", "order")
list_display = ("name", "price", "currency", "period", "is_active", "order")
list_editable = ("price", "is_active", "order")
filter_horizontal = ("features",)

Expand All @@ -23,7 +23,7 @@ class CompanyInquiryAdmin(admin.ModelAdmin):
"email",
"phone",
"created_at",
"is_processed"
"is_processed",
)
list_filter = ("is_processed", "created_at")
list_editable = ("is_processed",)
Expand Down
4 changes: 2 additions & 2 deletions app/services/foragencies/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@


class ForagenciesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app.services.foragencies'
default_auto_field = "django.db.models.BigAutoField"
name = "app.services.foragencies"
11 changes: 5 additions & 6 deletions app/services/foragencies/models.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@

from django.db import models


class AgencyPricingPlan(models.Model):
name = models.CharField(max_length=100, unique=True)
price = models.PositiveIntegerField(default=0)
currency = models.CharField(max_length=3, default='₽')
period = models.CharField(max_length=50, default='мес')
currency = models.CharField(max_length=3, default="₽")
period = models.CharField(max_length=50, default="мес")
description = models.CharField(max_length=50)
is_active = models.BooleanField(default=True)
order = models.PositiveIntegerField(default=0)

features = models.ManyToManyField(
'AgencyPlanFeature', related_name='plans', blank=True
"AgencyPlanFeature", related_name="plans", blank=True
)

class Meta:
ordering = ['order']
ordering = ["order"]

def __str__(self):
return self.name
Expand All @@ -38,4 +37,4 @@ class CompanyInquiry(models.Model):
is_processed = models.BooleanField(default=False)

def __str__(self):
return f'Заявка от {self.company_name} ({self.email})'
return f"Заявка от {self.company_name} ({self.email})"
77 changes: 40 additions & 37 deletions app/services/foragencies/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,72 +9,75 @@
class ForAgenciesTest(InertiaTestCase):
def setUp(self):
super().setUp()
self.plan = AgencyPricingPlan.objects.create(
name='Стартовый_test',
price=14990
)
self.feature = AgencyPlanFeature.objects.create(name='До 5 пользователей_test')
self.plan = AgencyPricingPlan.objects.create(name="Стартовый_test", price=14990)
self.feature = AgencyPlanFeature.objects.create(name="До 5 пользователей_test")
self.plan.features.add(self.feature)

def test_agency_view(self):
self.client.get(reverse('foragencies_page'))
self.assertComponentUsed('AgencyPricingPage')
self.client.get(reverse("foragencies_page"))
self.assertComponentUsed("AgencyPricingPage")
props = self.props()
self.assertIn('plans', props)
self.assertEqual(len(props['plans']), 1)
plan_props = props['plans'][0]
self.assertEqual(plan_props['name'], 'Стартовый_test')
self.assertEqual(len(plan_props['features']), 1)
self.assertEqual(plan_props['features'][0]['name'], 'До 5 пользователей_test')
self.assertIn("plans", props)
self.assertEqual(len(props["plans"]), 1)
plan_props = props["plans"][0]
self.assertEqual(plan_props["name"], "Стартовый_test")
self.assertEqual(len(plan_props["features"]), 1)
self.assertEqual(plan_props["features"][0]["name"], "До 5 пользователей_test")

def test_agency_view_no_active_plans(self):
AgencyPricingPlan.objects.all().update(is_active=False)
self.client.get(reverse('foragencies_page'))
self.assertComponentUsed('AgencyPricingPage')
self.client.get(reverse("foragencies_page"))
self.assertComponentUsed("AgencyPricingPage")
props = self.props()
self.assertEqual(len(props['plans']), 0)
self.assertEqual(len(props["plans"]), 0)

def test_company_inquiry_creation(self):
inquiry = CompanyInquiry.objects.create(
company_name='Company_test',
name='Konstantin',
email='test@email.com',
phone='123456',
company_name="Company_test",
name="Konstantin",
email="test@email.com",
phone="123456",
)
self.assertEqual(inquiry.company_name, 'Company_test')
self.assertEqual(inquiry.company_name, "Company_test")
self.assertFalse(inquiry.is_processed)
self.assertEqual(str(inquiry), 'Заявка от Company_test (test@email.com)')
self.assertEqual(str(inquiry), "Заявка от Company_test (test@email.com)")

def test_agency_view_post_inquiry(self):
data = {
'company_name': 'Post Co',
'name': 'Kostya',
'email': 'post@email.com',
'phone': '789',
"company_name": "Post Co",
"name": "Kostya",
"email": "post@email.com",
"phone": "789",
}
response = self.client.post(reverse('foragencies_page'), data)
response = self.client.post(reverse("foragencies_page"), data)
self.assertEqual(response.status_code, HTTPStatus.OK.value)
self.assertTrue(CompanyInquiry.objects.filter(company_name='Post Co').exists())
self.assertTrue(CompanyInquiry.objects.filter(company_name="Post Co").exists())

def test_agency_view_post_error(self):
data = {}
response = self.client.post(reverse('foragencies_page'), data)
response = self.client.post(reverse("foragencies_page"), data)
self.assertEqual(response.status_code, HTTPStatus.BAD_REQUEST.value)
self.assertJSONEqual(
response.content,
{'success': False, 'error': 'Обязательные поля: Название компании и email', }
{
"success": False,
"error": "Обязательные поля: Название компании и email",
},
)

def test_agency_view_post_wrong_email(self):
data = {
'company_name': 'Post Co',
'name': 'Kostya',
'email': 'postemail.com',
'phone': '789',
"company_name": "Post Co",
"name": "Kostya",
"email": "postemail.com",
"phone": "789",
}
response = self.client.post(reverse('foragencies_page'), data)
response = self.client.post(reverse("foragencies_page"), data)
self.assertEqual(response.status_code, HTTPStatus.BAD_REQUEST.value)
self.assertJSONEqual(
response.content,
{'success': False, 'error': 'Некорректный email', }
)
{
"success": False,
"error": "Некорректный email",
},
)
4 changes: 2 additions & 2 deletions app/services/foragencies/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
from . import views

urlpatterns = [
path('', views.AgencyView.as_view(), name='foragencies_page'),
]
path("", views.AgencyView.as_view(), name="foragencies_page"),
]
63 changes: 28 additions & 35 deletions app/services/foragencies/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,65 +12,58 @@ class AgencyView(View):
def get(self, request):
plans = AgencyPricingPlan.objects.filter(is_active=True)
props = {
'plans': [
"plans": [
{
'id': plan.id,
'name': plan.name,
'price': f"{plan.price:,}",
'currency': plan.currency,
'period': plan.period,
'description': plan.description,
'features': [
{'name': feature.name}
for feature in plan.features.all()
]
"id": plan.id,
"name": plan.name,
"price": f"{plan.price:,}",
"currency": plan.currency,
"period": plan.period,
"description": plan.description,
"features": [
{"name": feature.name} for feature in plan.features.all()
],
}
for plan in plans
]
}
return inertia_render(request, 'AgencyPricingPage', props)
return inertia_render(request, "AgencyPricingPage", props)

def post(self, request):
if request.content_type == 'application/json':
if request.content_type == "application/json":
try:
data = json.loads(request.body.decode('utf-8'))
data = json.loads(request.body.decode("utf-8"))
except json.JSONDecodeError:
return JsonResponse(
{'success': False, 'error': 'Invalid JSON'},
status=400
{"success": False, "error": "Invalid JSON"}, status=400
)
else:
data = request.POST.dict()

if not all(key in data for key in ['company_name', 'email']):
if not all(key in data for key in ["company_name", "email"]):
return JsonResponse(
{
'success': False,
'error': 'Обязательные поля: Название компании и email'
"success": False,
"error": "Обязательные поля: Название компании и email",
},
status=400
status=400,
)
if not data.get('email', '').count('@'):
if not data.get("email", "").count("@"):
return JsonResponse(
{'success': False, 'error': 'Некорректный email'},
status=400
{"success": False, "error": "Некорректный email"}, status=400
)
try:
CompanyInquiry.objects.create(
company_name=data.get('company_name'),
name=data.get('name'),
email=data.get('email'),
phone=data.get('phone', ''),
company_name=data.get("company_name"),
name=data.get("name"),
email=data.get("email"),
phone=data.get("phone", ""),
)
return JsonResponse({'success': True})
return JsonResponse({"success": True})

except ValidationError as e:
return JsonResponse(
{'success': False, 'error': str(e)},
status=400
)
return JsonResponse({"success": False, "error": str(e)}, status=400)
except Exception:
return JsonResponse(
{'success': False, 'error': 'Internal error'},
status=500
)
{"success": False, "error": "Internal error"}, status=500
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Generated by Django 5.2.7 on 2025-12-28 14:56

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('hh_parser', '0002_city_company_platform_remove_vacancy_area_and_more'),
]

operations = [
migrations.RemoveField(
model_name='vacancy',
name='city',
),
migrations.RemoveField(
model_name='vacancy',
name='company',
),
migrations.RemoveField(
model_name='vacancy',
name='platform',
),
migrations.DeleteModel(
name='City',
),
migrations.DeleteModel(
name='Company',
),
migrations.DeleteModel(
name='Platform',
),
migrations.DeleteModel(
name='Vacancy',
),
]
Loading