diff --git a/AuthApp/js_views.py b/AuthApp/js_views.py index bb35250..6454291 100644 --- a/AuthApp/js_views.py +++ b/AuthApp/js_views.py @@ -126,7 +126,7 @@ def send_message_ajax(request): return JsonResponse({'html': html}, status=400) Dict = { - 'logo': f'{request.scheme}://{sets["domain"]}/static/img/svg/LogoMobile.svg', + 'logo': f'{sets["domain"]}/static/img/svg/LogoMobile.svg', 'project_name': sets['project_name'], 'message_title': subject, 'message_text': f'
{_("ДАННЫЕ ЗАПРОСА")}
' diff --git a/GeneralApp/funcs_options.py b/GeneralApp/funcs_options.py index bf34d9d..282c38b 100644 --- a/GeneralApp/funcs_options.py +++ b/GeneralApp/funcs_options.py @@ -10,8 +10,15 @@ def get_options_by_opt_types(opt_types, only_vals=False): opts = Option.objects.filter(**kwargs) if opts and only_vals: - opts = opts.values('opt_type', 'value') - opts = {item['opt_type']: item['value'] for item in opts} + res = {} + opts = opts.values('opt_type', 'value', 'prefix') + for item in opts: + if item['prefix']: + res.update({item['opt_type']: f"{item['prefix']}{item['value']}"}) + else: + res.update({item['opt_type']: f"{item['value']}"}) + return res + return opts def get_first_option_value_by_opt_type(opt_type): diff --git a/GeneralApp/views.py b/GeneralApp/views.py index 9af48ce..66e17c3 100644 --- a/GeneralApp/views.py +++ b/GeneralApp/views.py @@ -19,18 +19,21 @@ def test_code(request): from RoutesApp.models import Route from ReferenceDataApp.models import Airport, City - try: - # body = request.body - # data = json.loads(body) - # if 'head' not in data or 'body' not in data or 'id' not in data: - # return JsonResponse(status=400, data={"message": "Invalid data format"}) - # user_id = data['id'] - user = request.user - payload = {'head': '123', 'body': 'qwerty'} - send_user_notification(user=user, payload=payload, ttl=1000) - return JsonResponse(status=200, data={"message": "Web push successful"}) - except TypeError: - return JsonResponse(status=500, data={"message": "An error occurred"}) + from RoutesApp.search_matches import search_matches + search_matches() + + # try: + # # body = request.body + # # data = json.loads(body) + # # if 'head' not in data or 'body' not in data or 'id' not in data: + # # return JsonResponse(status=400, data={"message": "Invalid data format"}) + # # user_id = data['id'] + # user = request.user + # payload = {'head': '123', 'body': 'qwerty'} + # send_user_notification(user=user, payload=payload, ttl=1000) + # return JsonResponse(status=200, data={"message": "Web push successful"}) + # except TypeError: + # return JsonResponse(status=500, data={"message": "An error occurred"}) # routes = Route.objects.all() # @@ -49,7 +52,7 @@ def test_code(request): # if required_save: # route.save() - # return HttpResponse('finished') + return HttpResponse('finished') diff --git a/RoutesApp/admin.py b/RoutesApp/admin.py index ae65e13..745c5b0 100644 --- a/RoutesApp/admin.py +++ b/RoutesApp/admin.py @@ -4,7 +4,7 @@ from django.contrib import admin class Admin_Route(Admin_Trans_BaseModel): list_display = [ - 'id', 'owner_type', 'type_transport', 'cargo_type', + 'id', 'owner_type', 'receive_msg_by_email', 'type_transport', 'cargo_type', 'departure_DT', 'from_city', 'from_place', 'arrival_DT', 'to_city', 'to_place', 'owner', 'order', 'modifiedDT', 'createDT' @@ -14,5 +14,6 @@ class Admin_Route(Admin_Trans_BaseModel): list_filter = ['owner_type', 'type_transport', 'cargo_type', 'from_place', 'arrival_DT', 'modifiedDT', 'createDT'] search_fields = ['owner__first_name', 'owner__last_name'] + raw_id_fields = ['from_city', 'to_city'] admin.site.register(Route,Admin_Route) diff --git a/RoutesApp/forms.py b/RoutesApp/forms.py index 55196c3..e4b768b 100644 --- a/RoutesApp/forms.py +++ b/RoutesApp/forms.py @@ -23,6 +23,7 @@ class RouteForm(forms.ModelForm): try: + if 'phone' in cleaned_data and 'phone' in cleaned_data: from BaseModels.validators.form_field_validators import get_phone_valid_error error = get_phone_valid_error(cleaned_data["phone"]) diff --git a/RoutesApp/funcs.py b/RoutesApp/funcs.py index 22e269c..1ee5adb 100644 --- a/RoutesApp/funcs.py +++ b/RoutesApp/funcs.py @@ -154,10 +154,13 @@ def get_routes_Dict(user=None, data=None): if val: if key == 'weight': weight_list = val.split(';') - if weight_list[0]: - kwargs.update({f'{key}__gte': int(weight_list[0])}) - if weight_list[1]: - kwargs.update({f'{key}__lte': int(weight_list[1])}) + if len(weight_list) > 1: + if weight_list[0]: + kwargs.update({f'{key}__gte': int(weight_list[0])}) + if weight_list[1]: + kwargs.update({f'{key}__lte': int(weight_list[1])}) + else: + kwargs.update({f'{key}__lte': int(weight_list[0])}) if key == 'type_transport': items_list = val.split(',') diff --git a/RoutesApp/js_views.py b/RoutesApp/js_views.py index 8cf7ffb..bb18bfe 100644 --- a/RoutesApp/js_views.py +++ b/RoutesApp/js_views.py @@ -230,7 +230,7 @@ def create_or_change_route_ajax(request, route_id=None): return JsonResponse({'html': html}, status=400) obj = form.save(commit=False) - if 'owner_type' in data: + if 'owner_type' in data and data['owner_type']: obj.owner_type = data['owner_type'] if obj.from_address_point: diff --git a/RoutesApp/management/__init__.py b/RoutesApp/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/RoutesApp/management/commands/__init__.py b/RoutesApp/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/RoutesApp/management/commands/every_1hour_start.py b/RoutesApp/management/commands/every_1hour_start.py new file mode 100644 index 0000000..fc5bc8f --- /dev/null +++ b/RoutesApp/management/commands/every_1hour_start.py @@ -0,0 +1,36 @@ +from django.core.management.base import BaseCommand +from datetime import datetime +from BaseModels.mailSender import techSendMail +from GeneralApp.funcs_options import get_options_by_opt_types, get_mail_send_options + +class Command(BaseCommand): + + def handle(self, *args, **options): + mail_sets = get_mail_send_options() + + log = '' + log_begin_DT = datetime.now() + msg = str(log_begin_DT) + print('-------------') + print(msg) + + try: + from ...search_matches import search_matches + msg = search_matches() + if msg: + print(msg) + except Exception as e: + msg = f'every_1hour_start search_matches fail = {str(e)}' + print(msg) + techSendMail(mail_sets, msg, title='every_1hour_start search_matches') + + + + if msg: + techSendMail(mail_sets, str(msg), title='every_1hour_start get_competitors_prices') + + + + print(f'- processing time = {str(datetime.now() - log_begin_DT)} -') + + diff --git a/RoutesApp/management/commands/fix_code.py b/RoutesApp/management/commands/fix_code.py new file mode 100644 index 0000000..669498e --- /dev/null +++ b/RoutesApp/management/commands/fix_code.py @@ -0,0 +1,13 @@ +from django.core.management.base import BaseCommand +from datetime import datetime + +class Command(BaseCommand): + + def handle(self, *args, **options): + + # from B2BApp.funcs import assign_contracts_for_orders_by_tmp_data + # log = assign_contracts_for_orders_by_tmp_data() + from GeneralApp.views import test_code + test_code(None) + + self.stdout.write(u'fix_code end') \ No newline at end of file diff --git a/RoutesApp/search_matches.py b/RoutesApp/search_matches.py new file mode 100644 index 0000000..65d9fec --- /dev/null +++ b/RoutesApp/search_matches.py @@ -0,0 +1,101 @@ +from .models import * +from datetime import datetime, timedelta +from django.utils.translation import gettext as _ +from django.template.loader import render_to_string +from GeneralApp.funcs_options import get_options_by_opt_types, get_mail_send_options +from BaseModels.mailSender import admin_send_mail_by_SMTPlib, techSendMail + +def send_mail_found_matches_routes(route, kwargs, search_owner_type): + + Dict = { + 'route': route, + 'search_owner_type': search_owner_type + } + sets = get_options_by_opt_types(['domain', 'project_name'], only_vals=True) + Dict.update(sets) + Dict.update({'logo': f'{sets["domain"]}/static/img/svg/LogoMobile.svg',}) + + find_routes_page_url = f'{sets["domain"]}/routes/route_search_results/?' + kwargs_list = [f'{key}={value}' for key, value in kwargs.items()] + kwargs_list.append(f'owner_type={search_owner_type}') + find_routes_page_url += f'{"&".join(kwargs_list)}' + Dict.update({'find_routes_page_url': find_routes_page_url}) + + html = render_to_string('mail/m_found_matched_routes.html', Dict) + + + mail_sets = get_mail_send_options() + to = [route.owner.email, 'web@syncsystems.net'] + subject = _('Мы нашли исполнителя по Вашему объявлению!') + res = admin_send_mail_by_SMTPlib( + mail_sets, + subject=subject, + from_email=mail_sets['sender_email'], to=to, + html_content=html + ) + + return res + + +def search_matches(for_routes=None): + + log = '' + + try: + if not for_routes: + for_routes = Route.objects.filter( + createDT__gte=datetime.now() - timedelta(hours=1), + receive_msg_by_email=True + ) + + check_fields = [ + 'type_transport', 'departure_DT', 'arrival_DT', 'from_address_point', 'to_address_point', + 'from_place', 'to_place', 'cargo_type', 'weight' + ] + + + for route in for_routes: + kwargs = {} + params = {} + + for field_name in check_fields: + field_val = getattr(route, field_name, None) + if field_val: + if type(field_val) == datetime: + params.update({f"{field_name}": f'{field_val.strftime("%d.%m.%Y")} - {field_val.strftime("%d.%m.%Y")}'}) + kwargs.update({f"{field_name}__date": field_val.date()}) + elif field_name == 'weight': + # print(field_name) + params.update({f"{field_name}": field_val}) + if route.owner_type == 'mover': + kwargs.update({f"{field_name}__lte": field_val}) + else: + kwargs.update({f"{field_name}__gte": field_val}) + else: + kwargs.update({field_name: field_val}) + params.update({field_name: field_val}) + + found_routes = Route.objects.exclude( + id=route.id, + ).exclude( + owner=route.owner + ).exclude( + owner_type=route.owner_type + ).filter( + **kwargs + # ).count( + ) + + if found_routes: + msg = send_mail_found_matches_routes(route, params, found_routes[0].owner_type) + if msg: + log += msg + + except Exception as e: + msg = f'+ Здравствуйте, {{ route.owner }}! +
+Ранее вы на сайте размещали объявление о поиске {% if search_owner_type == 'mover' %}Перевозчика{% else %}Отправителя{% endif %} и попросили нас уведомить Вас о появлении объявлений, которые соответствуют Вашему критерию.
+Хорошая новость!
+По заданным критериям поиска мы нашли исполнителя!
+Чтобы узнать подробности и открыть доступ к контактам, перейдите по этой ссылке и используйте свои учетные данные для входа. +
Если у вас возникнут вопросы или вам потребуется помощь, наша служба поддержки всегда готова помочь. Свяжитесь с нами по адресу support@tripwb.com
+ +
+ Спасибо за то, что вы с нами!
+ С уважением,
+ Команда Trip With Bonus.
+