|
| 1 | +from django.core.management.base import BaseCommand |
| 2 | +from django.db import transaction |
| 3 | +from conferences.models import Conference |
| 4 | +from sponsors.models import ( |
| 5 | + SponsorLevel, |
| 6 | + SponsorBenefit, |
| 7 | + SponsorLevelBenefit, |
| 8 | + SponsorSpecialOption, |
| 9 | +) |
| 10 | + |
| 11 | + |
| 12 | +class Command(BaseCommand): |
| 13 | + help = "Create sponsor levels, benefits, and their relationships based on the provided table" |
| 14 | + |
| 15 | + @transaction.atomic |
| 16 | + def handle(self, *args, **kwargs): |
| 17 | + conference = Conference.objects.last() |
| 18 | + |
| 19 | + SponsorLevelBenefit.objects.all().delete() |
| 20 | + SponsorBenefit.objects.all().delete() |
| 21 | + SponsorLevel.objects.all().delete() |
| 22 | + SponsorSpecialOption.objects.all().delete() |
| 23 | + |
| 24 | + # Create SponsorLevels |
| 25 | + levels = [ |
| 26 | + { |
| 27 | + "name": "Keystone", |
| 28 | + "price": "€ 10,000", |
| 29 | + "slots": 1, |
| 30 | + "highlight_color": "blue", |
| 31 | + }, |
| 32 | + { |
| 33 | + "name": "Gold", |
| 34 | + "price": "€ 7,000", |
| 35 | + "slots": 2, |
| 36 | + "highlight_color": "yellow", |
| 37 | + }, |
| 38 | + { |
| 39 | + "name": "Silver", |
| 40 | + "price": "€ 5,000", |
| 41 | + "slots": 5, |
| 42 | + "highlight_color": "gray", |
| 43 | + }, |
| 44 | + { |
| 45 | + "name": "Bronze", |
| 46 | + "price": "€ 3,000", |
| 47 | + "slots": 0, |
| 48 | + "highlight_color": "brown", |
| 49 | + }, |
| 50 | + { |
| 51 | + "name": "Patron", |
| 52 | + "price": "€ 1,000", |
| 53 | + "slots": 0, |
| 54 | + "highlight_color": "purple", |
| 55 | + }, |
| 56 | + { |
| 57 | + "name": "Startup", |
| 58 | + "price": "€ 500", |
| 59 | + "slots": 0, |
| 60 | + "highlight_color": "green", |
| 61 | + }, |
| 62 | + { |
| 63 | + "name": "Diversity", |
| 64 | + "price": "€ 1,000", |
| 65 | + "slots": 0, |
| 66 | + "highlight_color": "pink", |
| 67 | + }, |
| 68 | + ] |
| 69 | + |
| 70 | + for level_data in levels: |
| 71 | + SponsorLevel.objects.create( |
| 72 | + conference=conference, |
| 73 | + name=level_data["name"], |
| 74 | + price=level_data["price"], |
| 75 | + slots=level_data["slots"], |
| 76 | + highlight_color=level_data["highlight_color"], |
| 77 | + ) |
| 78 | + |
| 79 | + # Create SponsorBenefits with detailed descriptions |
| 80 | + benefits = [ |
| 81 | + { |
| 82 | + "name": "Sponsored Keynote (1h)", |
| 83 | + "category": SponsorBenefit.Category.CONTENT, |
| 84 | + "description": "This sponsor will have the chance to give a keynote to the whole audience of the conference. The keynote content has to be arranged with the event organization and has to be something of interest and value for the community.", |
| 85 | + }, |
| 86 | + { |
| 87 | + "name": "Sponsored talk (30min)", |
| 88 | + "category": SponsorBenefit.Category.CONTENT, |
| 89 | + "description": "These sponsors will have the chance to have a talk in the conference schedule. The talk content has to be arranged with the event organization and should have a technical relevance.", |
| 90 | + }, |
| 91 | + { |
| 92 | + "name": "Booth in exhibit hall", |
| 93 | + "category": SponsorBenefit.Category.BOOTH, |
| 94 | + "description": "There will be a dedicated space for sponsors in the hotel hall where all the attendees will have coffee breaks and lunch. This package provides a 60x180cm table and comfortable chairs, with power supply and exclusive high-speed Wi-Fi access. Note: All additional booth customizations are the responsibility of the sponsor. Booth position selection will follow a first-come, first-served policy, and is determined by the sponsorship level.", |
| 95 | + }, |
| 96 | + { |
| 97 | + "name": "Complimentary conference session passes", |
| 98 | + "category": SponsorBenefit.Category.PASSES, |
| 99 | + "description": "Free passes for the conference sessions.", |
| 100 | + }, |
| 101 | + { |
| 102 | + "name": "Conference session passes with discount (30%)", |
| 103 | + "category": SponsorBenefit.Category.PASSES, |
| 104 | + "description": "Discounted passes for the conference sessions.", |
| 105 | + }, |
| 106 | + { |
| 107 | + "name": "Social Event named after sponsor", |
| 108 | + "category": SponsorBenefit.Category.BRAND, |
| 109 | + "description": "The sponsors will see its name and logo shown during the social event and linked with that in all the related communication and official material.", |
| 110 | + }, |
| 111 | + { |
| 112 | + "name": "Logo on video titles", |
| 113 | + "category": SponsorBenefit.Category.BRAND, |
| 114 | + "description": "These sponsors will have their logo shown in all the official videos recorded and published online of the event.", |
| 115 | + }, |
| 116 | + { |
| 117 | + "name": "Logo on speaker desks", |
| 118 | + "category": SponsorBenefit.Category.BRAND, |
| 119 | + "description": "These sponsors will have their logo shown on the speakers podiums during all the conference talks.", |
| 120 | + }, |
| 121 | + { |
| 122 | + "name": "Logo on banners", |
| 123 | + "category": SponsorBenefit.Category.BRAND, |
| 124 | + "description": "These sponsors will have their logo shown on the information banners placed in the congress center during the event.", |
| 125 | + }, |
| 126 | + { |
| 127 | + "name": "Logo on website", |
| 128 | + "category": SponsorBenefit.Category.BRAND, |
| 129 | + "description": "These sponsors will have their logo shown on the official PyCon Italia website for the whole duration of the event.", |
| 130 | + }, |
| 131 | + { |
| 132 | + "name": "Logo on digital signage", |
| 133 | + "category": SponsorBenefit.Category.BRAND, |
| 134 | + "description": "These sponsors will have their logo shown on digital signage throughout the event venue.", |
| 135 | + }, |
| 136 | + { |
| 137 | + "name": "Recruiting track participation", |
| 138 | + "category": SponsorBenefit.Category.RECRUITING, |
| 139 | + "description": "The recruiting track will be hosted in a small and quiet room where the listed sponsors will have a time slot (highlighted in the schedule) in order to welcome all the interested people directly. Each sponsor will have a dedicated booking link where attendees can schedule their time slot.", |
| 140 | + }, |
| 141 | + { |
| 142 | + "name": "Job positions in the Job Board on the website", |
| 143 | + "category": SponsorBenefit.Category.RECRUITING, |
| 144 | + "description": "PyCon Italia website has a job board advertising the job offers of our sponsors. This board will be online until the next PyCon is organized (usually October of the next year). This board will be promoted to the event attendees and Python Italia channels subscribers (~7.5k contacts).", |
| 145 | + }, |
| 146 | + { |
| 147 | + "name": "One recruiting email to attendees (opt-in)", |
| 148 | + "category": SponsorBenefit.Category.RECRUITING, |
| 149 | + "description": "These sponsors will have the chance to send a dedicated email (through our systems, we don't give away any personal details) to the event attendees who will have opted-in to receive this kind of communications (usually about 1/4 of the total attendees).", |
| 150 | + }, |
| 151 | + { |
| 152 | + "name": "Arranged newsletter content highlighting the sponsor", |
| 153 | + "category": SponsorBenefit.Category.CONTENT, |
| 154 | + "description": "This sponsor will have one special dedicated content in the official newsletter. The content will be arranged with the organization.", |
| 155 | + }, |
| 156 | + { |
| 157 | + "name": "Questions in the conference feedback form", |
| 158 | + "category": SponsorBenefit.Category.ATTENDEE_INTERACTION, |
| 159 | + "description": "These sponsors will have the chance to suggest up to 2 questions in the feedback form sent to all the attendees after the event closing.", |
| 160 | + }, |
| 161 | + { |
| 162 | + "name": "One tweet to all @PyConIT subscribers", |
| 163 | + "category": SponsorBenefit.Category.BRAND, |
| 164 | + "description": "These sponsors will have the chance to have one sponsored content tweeted directly on our Twitter account.", |
| 165 | + }, |
| 166 | + { |
| 167 | + "name": "One post on all the official @PyConIT social channels", |
| 168 | + "category": SponsorBenefit.Category.BRAND, |
| 169 | + "description": 'These sponsors will have a "thank you" post on our social channels.', |
| 170 | + }, |
| 171 | + { |
| 172 | + "name": "Participation in the gamification", |
| 173 | + "category": SponsorBenefit.Category.ATTENDEE_INTERACTION, |
| 174 | + "description": "Every year the PyCon Italia organization prepares a special game for the attendees. This sponsor have the chance to be included in this special initiative with a mention or more (details depends on the kind of game/riddle).", |
| 175 | + }, |
| 176 | + { |
| 177 | + "name": "Shared meeting room", |
| 178 | + "category": SponsorBenefit.Category.BOOTH, |
| 179 | + "description": "These sponsors will have the chance to book a quiet meeting room just in front of the conference rooms. This room will have a shared calendar.", |
| 180 | + }, |
| 181 | + ] |
| 182 | + |
| 183 | + for benefit_data in benefits: |
| 184 | + SponsorBenefit.objects.create( |
| 185 | + conference=conference, |
| 186 | + name=benefit_data["name"], |
| 187 | + category=benefit_data["category"], |
| 188 | + description=benefit_data["description"], |
| 189 | + ) |
| 190 | + |
| 191 | + # Create SponsorLevelBenefits (same as before) |
| 192 | + level_benefits = { |
| 193 | + "Keystone": { |
| 194 | + "Sponsored Keynote (1h)": "✓", |
| 195 | + "Booth in exhibit hall": "✓", |
| 196 | + "Complimentary conference session passes": "6", |
| 197 | + "Conference session passes with discount (30%)": "10", |
| 198 | + "Social Event named after sponsor": "✓", |
| 199 | + "Logo on video titles": "✓", |
| 200 | + "Logo on speaker desks": "✓", |
| 201 | + "Logo on banners": "✓", |
| 202 | + "Logo on website": "✓", |
| 203 | + "Logo on digital signage": "✓", |
| 204 | + "Recruiting track participation": "✓", |
| 205 | + "Job positions in the Job Board on the website": "3", |
| 206 | + "One recruiting email to attendees (opt-in)": "✓", |
| 207 | + "Arranged newsletter content highlighting the sponsor": "✓", |
| 208 | + "Questions in the conference feedback form": "✓", |
| 209 | + "One tweet to all @PyConIT subscribers": "✓", |
| 210 | + "One post on all the official @PyConIT social channels": "✓", |
| 211 | + "Participation in the gamification": "✓", |
| 212 | + "Shared meeting room": "✓", |
| 213 | + }, |
| 214 | + "Gold": { |
| 215 | + "Sponsored talk (30min)": "✓", |
| 216 | + "Booth in exhibit hall": "✓", |
| 217 | + "Complimentary conference session passes": "4", |
| 218 | + "Conference session passes with discount (30%)": "8", |
| 219 | + "Logo on video titles": "✓", |
| 220 | + "Logo on speaker desks": "✓", |
| 221 | + "Logo on banners": "✓", |
| 222 | + "Logo on website": "✓", |
| 223 | + "Logo on digital signage": "✓", |
| 224 | + "Recruiting track participation": "✓", |
| 225 | + "Job positions in the Job Board on the website": "2", |
| 226 | + "One recruiting email to attendees (opt-in)": "✓", |
| 227 | + "Questions in the conference feedback form": "✓", |
| 228 | + "One tweet to all @PyConIT subscribers": "✓", |
| 229 | + "One post on all the official @PyConIT social channels": "✓", |
| 230 | + "Shared meeting room": "✓", |
| 231 | + }, |
| 232 | + # Add other levels (Silver, Bronze, Patron, Startup, Diversity) here... |
| 233 | + } |
| 234 | + |
| 235 | + for level_name, benefits in level_benefits.items(): |
| 236 | + level = SponsorLevel.objects.get(name=level_name, conference=conference) |
| 237 | + for benefit_name, value in benefits.items(): |
| 238 | + benefit = SponsorBenefit.objects.get( |
| 239 | + name=benefit_name, conference=conference |
| 240 | + ) |
| 241 | + SponsorLevelBenefit.objects.create( |
| 242 | + sponsor_level=level, |
| 243 | + benefit=benefit, |
| 244 | + value=value, |
| 245 | + ) |
| 246 | + |
| 247 | + special_options = [ |
| 248 | + { |
| 249 | + "name": "Advertising in the PyCon Italia Digital Signage", |
| 250 | + "description": "Your advertisement will be shown on the program/information displays in the venue during the conference. (additional ADs cost is €500 each) ADs may be still images or short videos, the content must be provided by the sponsor company and will be shown on the conference location during all the conference time.", |
| 251 | + "price": 1000.00, |
| 252 | + }, |
| 253 | + { |
| 254 | + "name": "Sponsored Selfie / Pic Background", |
| 255 | + "description": "The sponsor will have its logo shown on the big selfie / pic background (4.1mt * 2mt), that will be put just near to the registration/information desk for the whole event.", |
| 256 | + "price": 2000.00, |
| 257 | + }, |
| 258 | + { |
| 259 | + "name": "Beginners' Workshop Sponsor", |
| 260 | + "description": "The sponsor will have its name and logo shown along all the communication and during this initiative (~120 people).", |
| 261 | + "price": 1000.00, |
| 262 | + }, |
| 263 | + { |
| 264 | + "name": "Network Area Sponsor (Logo and Name of the Network Area)", |
| 265 | + "description": "The sponsor will have its name and logo shown on the communication and in this area where people can stay, relax, chat and network together.", |
| 266 | + "price": 2000.00, |
| 267 | + }, |
| 268 | + { |
| 269 | + "name": "Logo on Lanyard (Lanyard Included)", |
| 270 | + "description": "The sponsor will have its logo printed on all the lanyards of the attendees.", |
| 271 | + "price": 1500.00, |
| 272 | + }, |
| 273 | + { |
| 274 | + "name": "Workshop Sponsor (Logo in Training Rooms)", |
| 275 | + "description": "The sponsor logo will be shown in the training room for the whole event duration.", |
| 276 | + "price": 1500.00, |
| 277 | + }, |
| 278 | + { |
| 279 | + "name": "Optional Booth in Front of Conference Rooms", |
| 280 | + "description": "The sponsor can have an extra desk in front of the conference rooms - this option may not be available for safety reasons.", |
| 281 | + "price": 2000.00, |
| 282 | + }, |
| 283 | + { |
| 284 | + "name": "Optional Small Table in Front of Conference Rooms", |
| 285 | + "description": "The sponsor can have an extra small round (80cm diameter) high table in front of the conference rooms - this option may not be available for safety reasons.", |
| 286 | + "price": 800.00, |
| 287 | + }, |
| 288 | + { |
| 289 | + "name": "More Job Positions in the Job Board", |
| 290 | + "description": "The sponsor can have more slots available to be published in the Job Board.", |
| 291 | + "price": 200.00, |
| 292 | + }, |
| 293 | + ] |
| 294 | + |
| 295 | + for option_data in special_options: |
| 296 | + SponsorSpecialOption.objects.create( |
| 297 | + conference=conference, |
| 298 | + name=option_data["name"], |
| 299 | + description=option_data["description"], |
| 300 | + price=option_data["price"], |
| 301 | + ) |
| 302 | + |
| 303 | + self.stdout.write( |
| 304 | + self.style.SUCCESS( |
| 305 | + "Successfully created sponsor levels, benefits, their relationships, and special options" |
| 306 | + ) |
| 307 | + ) |
0 commit comments