Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Create Exhibitor when signing IR #1235

Draft
wants to merge 14 commits into
base: master
Choose a base branch
from
Draft
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
2 changes: 1 addition & 1 deletion .github/workflows/pr-style.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: psf/black@23.3.0
- uses: psf/black@24.4.2
with:
options: "--check"
src: "."
Expand Down
8 changes: 8 additions & 0 deletions ais_static/root.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
.application-status {
border-radius: 10px;
padding: 5px;
margin: 5px;
font-size: 12px;
border: 1px solid #ccc;
}

.home-image {
width: 100%;
height: auto;
Expand Down
95 changes: 0 additions & 95 deletions dashboard/api/registration/cr.py

This file was deleted.

52 changes: 30 additions & 22 deletions dashboard/api/registration/registration.py
Original file line number Diff line number Diff line change
@@ -1,44 +1,52 @@
from django.views.decorators.csrf import csrf_exempt

from util import get_company_contact, get_exhibitor, get_fair, get_user, status
from util import (
get_company_contact,
get_contract_signature,
get_exhibitor,
get_fair,
get_user,
status,
)
from util.permission import UserPermission

from companies.models import Company, CompanyContact
from fair.models import RegistrationState
from fair.models import RegistrationPeriod
from exhibitors.models import Exhibitor

from dashboard.api.registration.cr import handle_cr, submit_cr
from dashboard.api.registration.ir import handle_ir, submit_ir
from dashboard.api.registration.response import handle_response, submit_cr, submit_ir


# (Didrik 2024)
# During the 2024 fair, we decided to add a IR-bypass system,
# allowing companies to sign up for IR after the official IR period had ended.
# We do this by creating an exhibitor after the company has signed the IR contract.
# This function handles the creation of exhibitors for companies which had signed
# IR before this change was implemented. It will not be needed in the future,
# but also does not cause any harm to keep.
def ensure_exhibitor_exists_after_ir_signup(fair, company):
_ir_contract, ir_signature = get_contract_signature(company, fair, "INITIAL")
exhibitor = Exhibitor.objects.filter(fair=fair, company=company).first()

if ir_signature != None and exhibitor == None:
Exhibitor.objects.create(fair=fair, company=company)


# This function will receive a GET or PUT and return
# a json structure of the registration state.
def render_company(request, company, contact, exhibitor):
fair = get_fair()
period = fair.get_period()

ir_states = [
RegistrationState.BEFORE_IR,
RegistrationState.IR,
RegistrationState.AFTER_IR,
RegistrationState.AFTER_IR_ACCEPTANCE,
]
if period in ir_states:
return handle_ir(request, company, fair, contact, exhibitor)
elif period == RegistrationState.CR:
return handle_cr(request, company, fair, contact, exhibitor)
elif period == RegistrationState.AFTER_CR:
# todo: temporary. What should really happen after CR?
return handle_cr(request, company, fair, contact, exhibitor)
else:
return status.INVALID_REGISTRATION_PERIOD
ensure_exhibitor_exists_after_ir_signup(fair, company)

return handle_response(request, company, fair, contact, exhibitor)


@csrf_exempt
def sign_ir(request):
fair = get_fair()
period = fair.get_period()
if period != RegistrationState.IR:
if period != RegistrationPeriod.IR:
return status.INVALID_SUBMIT_PERIOD

user = get_user(request)
Expand All @@ -58,7 +66,7 @@ def sign_ir(request):
def sign_cr(request):
fair = get_fair()
period = fair.get_period()
if period != RegistrationState.CR:
if period != RegistrationPeriod.CR:
return status.INVALID_SUBMIT_PERIOD

user = get_user(request)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
import datetime
from ais.common import settings
from dashboard.api.registration.types.registration import get_registration
from exhibitors.models import Exhibitor
from util import JSONError, get_user, status

from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.conf import settings

from util import JSONError, get_user, status
from util.email import send_mail
from util.ip import get_client_ip

from dashboard.api.registration.types.registration import get_registration
from dashboard.api.registration.types.util import get_serializer, put_registration

from register.models import SignupLog
from accounting.models import Order

from util.email import send_mail
from util.ip import get_client_ip

def handle_ir(request, company, fair, contact, exhibitor):

def handle_response(request, company, fair, contact, exhibitor):
try:
registration = get_registration(company, fair, contact, exhibitor)
except JSONError as error:
Expand All @@ -30,6 +32,71 @@ def handle_ir(request, company, fair, contact, exhibitor):
return status.UNSUPPORTED_METHOD


@require_POST
def submit_cr(request, company, fair, contact, exhibitor):
try:
registration = get_registration(company, fair, contact, exhibitor)
except JSONError as error:
return error.status

# Currently will not happen, because you can only
# call submit on your own company
if registration.contact == None:
return status.COMPANY_DOES_NOT_EXIST

signature = registration.cr_signature

if signature != None:
return status.EXHIBITOR_ALREADY_SIGNED

signature = SignupLog.objects.create(
company_contact=contact,
contract=registration.cr_contract,
company=company,
ip_address=get_client_ip(request),
)

# Add package products
package_products = Order.objects.filter(
purchasing_company=company,
product__revenue__fair=fair,
product__category__name="Package",
)
for package in package_products:
for child in package.product.child_products.all():
Order.objects.create(
purchasing_company=company,
product=child.child_product,
quantity=child.quantity,
unit_price=0, # A package product is free
)

# Untested
# Todo: Add packages to email
send_mail(
request,
template="register/email/cr_complete.html",
context={
"company": company,
"fair": fair,
"signature": signature,
"deadline": registration.deadline,
},
subject="Final registration received!",
to=[signature.company_contact.email_address],
file_paths=[settings.MEDIA_ROOT + signature.contract.contract.url[6:]],
)

try:
registration = get_registration(company, fair, contact, exhibitor)
except JSONError as error:
return error.status

serializer = get_serializer(request, registration)

return JsonResponse(serializer.data, safe=False)


def send_ir_confirmation_email(
request,
fair,
Expand Down Expand Up @@ -93,10 +160,12 @@ def submit_ir(request, company, fair, contact):
ip_address=get_client_ip(request),
)

exhibitor = Exhibitor.objects.create(fair=fair, company=company)

send_ir_confirmation_email(request, fair, signature, company)

try:
registration = get_registration(company, fair, contact, None)
registration = get_registration(company, fair, contact, exhibitor)
except JSONError as error:
return error.status

Expand Down
Loading
Loading