|
55 | 55 | from app.models.user_follow_group import UserFollowGroup |
56 | 56 | from app.settings import get_settings |
57 | 57 |
|
| 58 | +from ...models.badge_field_form import BadgeFieldForms |
| 59 | +from ...models.badge_form import BadgeForms |
| 60 | +from .badge_forms import ( |
| 61 | + create_base64_img_qr, |
| 62 | + get_value_from_field_indentifier, |
| 63 | + get_value_from_qr_filed, |
| 64 | +) |
| 65 | +from .errors import NotFoundError |
58 | 66 | from .import_helpers import update_import_job |
59 | 67 |
|
60 | 68 | """ |
61 | 69 | Define all API v2 celery tasks here |
62 | 70 | This is done to resolve circular imports |
63 | 71 | """ |
64 | 72 |
|
65 | | - |
66 | 73 | logger = logging.getLogger(__name__) |
67 | 74 |
|
68 | 75 |
|
@@ -727,7 +734,6 @@ def export_admin_sales_csv_task(self, status='all'): |
727 | 734 |
|
728 | 735 | @celery.task(base=RequestContextTask, name='export.speakers.csv', bind=True) |
729 | 736 | def export_speakers_csv_task(self, event_id, status='all'): |
730 | | - |
731 | 737 | if status not in [ |
732 | 738 | 'all', |
733 | 739 | 'pending', |
@@ -833,7 +839,6 @@ def rename_chat_room(event_id): |
833 | 839 |
|
834 | 840 | @celery.task(base=RequestContextTask, name='export.group.followers.csv', bind=True) |
835 | 841 | def export_group_followers_csv_task(self, group_id): |
836 | | - |
837 | 842 | followers = UserFollowGroup.query.filter_by(group_id=group_id).all() |
838 | 843 |
|
839 | 844 | try: |
@@ -861,3 +866,97 @@ def export_group_followers_csv_task(self, group_id): |
861 | 866 | logging.exception('Error in exporting group followers as CSV') |
862 | 867 |
|
863 | 868 | return result |
| 869 | + |
| 870 | + |
| 871 | +@celery.task(base=RequestContextTask, name='export.badge.pdf', bind=True) |
| 872 | +def create_print_badge_pdf(self, attendee_id, list_field_show): |
| 873 | + """ |
| 874 | + Create tickets and invoices for the holders of an order. |
| 875 | + @param self: create_print_badge_pdf |
| 876 | + @param attendee_id: attendee |
| 877 | + @param list_field_show: field will be included in badge pdf |
| 878 | + @return: create pdf file and return download link |
| 879 | + """ |
| 880 | + try: |
| 881 | + ticket_holder, badge_form, badge_field_forms = validate_badge_print(attendee_id) |
| 882 | + for field in badge_field_forms: |
| 883 | + field.sample_text_tmp = field.sample_text |
| 884 | + if field.custom_field is not None and field.custom_field.lower() == 'qr': |
| 885 | + qr_code_data = get_value_from_qr_filed(field, ticket_holder) |
| 886 | + qr_rendered = render_template('cvf/badge_qr_template.cvf', **qr_code_data) |
| 887 | + field.sample_text = create_base64_img_qr(qr_rendered) |
| 888 | + continue |
| 889 | + if list_field_show is None or field.field_identifier not in list_field_show: |
| 890 | + field.sample_text = ' ' |
| 891 | + continue |
| 892 | + get_value_from_field_indentifier(field, ticket_holder) |
| 893 | + # Font style set up |
| 894 | + for field in badge_field_forms: |
| 895 | + font_weight = [] |
| 896 | + font_style = [] |
| 897 | + text_decoration = [] |
| 898 | + field.font_weight_tmp = field.font_weight |
| 899 | + if field.font_weight is not None: |
| 900 | + for item in field.font_weight: |
| 901 | + if item.get('font_weight', False): |
| 902 | + font_weight.append(item.get('font_weight')) |
| 903 | + if item.get('font_style', False): |
| 904 | + font_style.append(item.get('font_style')) |
| 905 | + if item.get('text_decoration', False): |
| 906 | + text_decoration.append(item.get('text_decoration')) |
| 907 | + field.font_weight = 'none' if not font_weight else ','.join(font_weight) |
| 908 | + field.font_style = 'none' if not font_style else ','.join(font_style) |
| 909 | + field.text_decoration = ( |
| 910 | + 'none' if not text_decoration else ','.join(text_decoration) |
| 911 | + ) |
| 912 | + badge_url = create_save_pdf( |
| 913 | + render_template( |
| 914 | + 'pdf/badge_forms.html', |
| 915 | + badgeForms=badge_form, |
| 916 | + badgeFieldForms=badge_field_forms, |
| 917 | + ), |
| 918 | + UPLOAD_PATHS['pdf']['badge_forms_pdf'].format(identifier=badge_form.badge_id), |
| 919 | + identifier=badge_form.badge_id, |
| 920 | + ) |
| 921 | + result = {'download_url': badge_url} |
| 922 | + ticket_holder.is_badge_printed = True |
| 923 | + ticket_holder.badge_printed_at = datetime.now() |
| 924 | + for badge_field in badge_field_forms: |
| 925 | + badge_field.font_weight = badge_field.font_weight_tmp |
| 926 | + badge_field.sample_text = badge_field.sample_text_tmp |
| 927 | + save_to_db(ticket_holder, 'Ticket Holder saved') |
| 928 | + except AttributeError as e: |
| 929 | + result = {'__error': True, 'result': str(e)} |
| 930 | + except Exception: |
| 931 | + logging.exception( |
| 932 | + '%s: Error in exporting Badge as PDF', self.request.id.__str__() |
| 933 | + ) |
| 934 | + result = { |
| 935 | + '__error': True, |
| 936 | + 'result': 'Unexpected error when trying to print badge, please try again.', |
| 937 | + } |
| 938 | + return result |
| 939 | + |
| 940 | + |
| 941 | +def validate_badge_print(attendee_id): |
| 942 | + """ |
| 943 | + Validate and get attendee, badge form and badge field |
| 944 | + @param attendee_id: attendee |
| 945 | + @return: ticket_holder, badge_form, badge_field_forms |
| 946 | + """ |
| 947 | + ticket_holder = TicketHolder.query.filter_by(id=attendee_id).first() |
| 948 | + if ticket_holder is None: |
| 949 | + raise NotFoundError('This ticket holder is not associated with any ticket') |
| 950 | + badge_form = BadgeForms.query.filter_by( |
| 951 | + badge_id=ticket_holder.ticket.badge_id |
| 952 | + ).first() |
| 953 | + if badge_form is None: |
| 954 | + raise NotFoundError('This badge form is not associated with any ticket') |
| 955 | + badge_field_forms = ( |
| 956 | + BadgeFieldForms.query.filter_by(badge_form_id=badge_form.id) |
| 957 | + .filter_by(badge_id=badge_form.badge_id) |
| 958 | + .filter_by(is_deleted=False) |
| 959 | + .order_by(asc("id")) |
| 960 | + .all() |
| 961 | + ) |
| 962 | + return ticket_holder, badge_form, badge_field_forms |
0 commit comments