def clean_name(self): name = slugify(self.cleaned_data["name"]) try: s = SiteConfig.objects.all() if self.instance.pk: s = s.exclude(pk=self.instance.pk) s.get(name__iexact=name) except SiteConfig.DoesNotExist: return name raise forms.ValidationError(_("That configuration parameter name already exists."))
def generate_filename(self, instance, filename): ext = os.path.splitext(filename)[1] if not ext: ext = '.jpg' filename = '%s-%s-%s-%s%s' % (instance.user.pk, instance.pk or uuid4().hex[::6], slugify(instance.username)[:10], uuid4().hex[::8], ext) return super(AvatarImageField, self).generate_filename(instance, filename)
def clean_name(self): name = slugify(self.cleaned_data['name']) try: s = SiteConfig.objects.all() if self.instance.pk: s = s.exclude(pk=self.instance.pk) s.get(name__iexact=name) except SiteConfig.DoesNotExist: return name raise forms.ValidationError( _("That configuration parameter name already exists."))
def create_photo_versions(sender, instance, **kwargs): """Create `PhotoVersion`` objects for the photo object defined by `instance`. A version is created for a bounding box defined by each PhotoSize instance. """ from photo.models import Photo, PhotoSize, PhotoVersion photo = instance ext = '.jpg' t = None try: pth = photo.image.path except NotImplementedError: from django.core.files.temp import NamedTemporaryFile t = NamedTemporaryFile(suffix=ext) ix = photo.image if ix.closed: # Reload from DB photo = Photo.objects.get(pk=photo.pk) ix = photo.image for d in ix.chunks(4000000): t.write(d) t.flush() t.seek(0) pth = t for size in PhotoSize.objects.all(): # Create a suitable filename. filename = '%s-%s-%s%s' % (photo.pk, uuid4().hex[::7], slugify(size.name)[:10], ext) ctype = guess_type(filename)[0] temp_file = TemporaryUploadedFile(name=filename, content_type=ctype, size=0, charset=None) if t: t.seek(0) try: version = PhotoVersion.objects.get(photo=photo, size=size) remove_model_image(version, 'image') version.image = None except PhotoVersion.DoesNotExist: version = PhotoVersion(photo=photo, size=size) if size.do_crop: resize_to, crop_box, input_image = get_perfect_fit_resize_crop(size.bounding_box, (photo.width, photo.height)) else: resize_to = size.bounding_box crop_box = None # Resize to a temporary location. resize(pth, resize_to, out_file_path=temp_file, crop=crop_box) # Save resized copy to `version` instance. temp_file.seek(0) # Prepare file for a re-read. version.image.save(name=filename, content=temp_file, save=True) temp_file.close() if t: t.close()
def import_parties(filepath, hashtag, location=u'austin', venue_city='Austin', venue_state='TX', venue_zip=u'', event_source='sxsw-party', geoloc="30.27,-97.74", **kwargs): from artist.models import ArtistProfile from event.models import Event, Venue from lastfm import get_artist from lastfm.fetch_events import get_raw_image parent, filename = os.path.split(_DEFAULT_IMAGE) party_images = { '#SXSWi #Party'.lower():os.path.join(parent, "sxswi_party.jpg"), '#SXSWm #Party'.lower():os.path.join(parent, "sxswm_party.jpg"), } _ARTIST = ArtistProfile.objects.get(url='riotvine-member') _DATE_FORMAT = "%m/%d/%Y" # format: 03/17/2010 f = open(filepath, 'r') f.readline() # skip first line -- Date|Actual Date|Event|Venue|Band|Free|Free Drinks|Map|Details|Link| lines = f.readlines() max = len(lines) rnum = 0 img = party_images.get(hashtag.lower(), None) has_image = True if not img: has_image = False img = _DEFAULT_IMAGE f = open(img, "rb") raw_image_contents = f.read() f.close() while True: if rnum >= max: break r = lines[rnum].strip().split('|') print rnum, r venue = r[3].strip().decode("utf-8").strip() venue_address = u'' querystring = urlencode({'q':u'"%s" %s, %s %s' % (venue[:25], venue_address, venue_city, venue_state)}) map_url = u'http://maps.google.com/?%s' % querystring vn, created = Venue.objects.get_or_create( name=venue[:255], geo_loc=geoloc, defaults=dict( source='user-entered', address=venue_address[:255], city=venue_city[:255], state=venue_state, zip_code=venue_zip[:12], venue_url=u'', map_url=map_url, ) ) event_name = r[2] event_date = r[1] # MM/DD/YYYY if 'err' in event_date.lower(): rnum += 1 continue dt = strptime(event_date, _DATE_FORMAT) event_date = date(*dt[:3]) event_time = None headliner = u'' is_free = r[5] and "y" in r[5].lower() free_drinks = r[6] and "y" in r[6].lower() band = r[4] description = u"" if band and 'tba' not in band.lower(): description = u'<p class="band party party-band">%s</p>' % band.decode("utf-8") if free_drinks: description = description + u"\n<p><strong>Free Drinks!</strong></p>\n" external_url = r[9].strip() if 'no hyperlink' in external_url.lower(): external_url = u'' event_id = u'' else: x = urlparse.urlsplit(external_url) qx = x.query qx_dict = parse_qs(qx) qx_dict.pop("appSession", None) # remove session id from URL to make it work event_id = qx_dict.get("RecordID")[0] new_dict = {} for k, v in qx_dict.iteritems(): new_dict[k]=v[0] qx = urlencode(new_dict) external_url = urlparse.urlunsplit((x.scheme, x.netloc, x.path, qx, x.fragment)) description = description + u'\n<p><a href="%s">More details »</a></p>\n' % external_url title = u"%s at %s %s" % (event_name.decode('utf-8'), vn.name.decode('utf-8'), hashtag) Event.objects.filter(ext_event_id=event_id, ext_event_source=event_source).delete() ex = Event( ext_event_id=event_id, ext_event_source=event_source, artist=_ARTIST, creator=_ARTIST.user_profile, description=description, is_submitted=True, is_approved=True, is_free=is_free, title=title[:120], url=(u"%s-%s" % (slugify(title)[:30], uuid4().hex[::4]))[:35], venue=vn, event_date=event_date, event_start_time=event_time, event_timezone=u'', hashtag=u'', location=location, headliner=u'', artists=u'', has_image=has_image, ) image_content = ContentFile(raw_image_contents) fname, ext = os.path.splitext("default.jpg") fname = u'%s%s' % (uuid4().hex[::2], ext) ex.image.save(fname, image_content, save=False) ex._create_resized_images(raw_field=None, save=False) ex.save() print ex, ex.ext_event_id rnum += 1
def insert(events, loc): """Iterate through event list and insert into DB""" n = 0 type_errors = 0 for e in events: try: lfm_id = e['id'] except TypeError, te: _log.warn("Skipped TypeError on badly formatted event data: %s" % e) type_errors += 1 continue existing_event = is_event_in_db(lfm_id) if existing_event and not _UPDATE_EXISTING: continue # skip events that already exist in DB image, image_content = None, None image = get_image_url(e['image']) if not image: continue # We can't work without a badge image event_date = e['startDate'] # format: Tue, 07 Jul 2009 dtx = event_date.split(' ') event_date = ' '.join(dtx[:4]) # discard any time component dt = time.strptime(event_date, _DATE_FORMAT) event_date = date(*dt[:3]) if event_date < _TODAY: continue # Ignore past events venue_url = e['venue']['url'] if not venue_url: continue # Don't accept bad venues title = e['title'] website = e['website'] desc = e['description'] headliner = e['artists'].get('headliner', '') artist_list = set([a for a in e['artists']['artist'] if len(a) > 1 and a != headliner]) if not artist_list: if headliner: artist_list = [] else: artist_list = [title] full_list = list(artist_list) if headliner: full_list.insert(0, headliner) csv_artist_list = full_list and u",".join(full_list) or u"" quoted_list = [u'"%s"' % a for a in full_list] hashtag = u",".join(quoted_list) art_html = [u"<li>%s</li>" % a for a in artist_list] if headliner: art_html.insert(0, u'<li class="headliner">%s</li>' % headliner) art_html = u"<h4 class='artist_title'>Artists</h4><ul class='artist_list'>%s</ul>\n" % u"\n".join(art_html) desc = u"%s%s" % (art_html, desc) venue = e['venue']['name'].strip() venue_address = e['venue']['location']['street'].strip() venue_city = e['venue']['location']['city'].strip() venue_zip = e['venue']['location']['postalcode'].strip() if headliner and venue and headliner == title: # Change title format to: # headliner at venue name! mm/dd mm_dd = event_date.strftime("%m/%d") title = u"%s at %s! %s" % (headliner, venue, mm_dd) if len(title) > 120: title = u"%s.." % title[:118] lat, lng = None, None source = '' if e['venue']['location'].get("geo:point", {}).get("geo:lat", None): lat = e['venue']['location']["geo:point"]["geo:lat"] lng = e['venue']['location']["geo:point"]["geo:long"] lat = str(round(float(lat), 3)) lng = str(round(float(lng), 3)) source = u"%s,%s" % (lat, lng) tz = e['venue']['location'].get('timezone', '') event_time = e.get('startTime', "21:00") has_start_time = 'startTime' in e image_content = ContentFile(get_raw_image(image)) fname, ext = os.path.splitext(image) fname = u'%s%s' % (uuid4().hex[::2], ext) vn, created = Venue.objects.get_or_create( name=venue[:255], geo_loc=source, defaults=dict( source='last-fm', address=venue_address[:255], city=venue_city[:255], zip_code=venue_zip[:12], venue_url=venue_url[:255], ) ) if False and not created and vn.source != 'last-fm': # Update empty fields dirty = False if not vn.address: vn.address = venue_address[:255] dirty = True if not vn.city: vn.city = venue_city[:255] dirty = True if not vn.zip_code: vn.zip_code = venue_zip[:12] dirty = True if not vn.venue_url: vn.venue_url = venue_url[:255] dirty = True if dirty: vn.save() if existing_event: # only update title on this existing event existing_event.title = title[:120] super(Event, existing_event).save() _x.debug("Updated title for %s", existing_event) else: user_profile = get_artist_user_profile(headliner) ex = Event( lastfm_id = lfm_id, artist=_ARTIST, creator=user_profile, is_submitted=True, is_approved=True, title=title[:120], url=(u"%s-%s" % (slugify(title)[:30], uuid4().hex[::4]))[:35], description=desc, venue=vn, event_date=event_date, event_start_time=event_time, event_timezone=tz, hashtag=u'', # hashtag[:250], # don't fetch tweets for last.fm generated events (3/23/2010) location=loc, headliner=headliner[:200] or u'', artists=csv_artist_list[:250] or u'', ext_event_source='last.fm', ) ex._has_start_time = ex.event_start_time and has_start_time ey = try_merge(ex) if ey: # new event is a duplicate; hide it ex.is_deleted = True _x.warn("Merged %s into %s", ex, ey) ex.image.save(fname, image_content, save=False) ex._create_resized_images(raw_field=None, save=False) ex.save() ex.attendee_set.get_or_create(attendee_profile=user_profile) _x.debug("Saved %s", ex) n += 1
def save(self, commit=True): event = super(EventForm, self).save(commit=False) inst = self.instance is_new = not inst.pk if not inst.pk: event.location = self.location event.is_member_generated = not user_profile.is_artist image_changed = False img = self.cleaned_data.get("image", None) if img: event.image.save("badge", img, save=False) image_changed = True bg_image = self.cleaned_data.get("bg_image", None) if not bg_image and self.cleaned_data.get("use_twitter_background", False): bg_image_url = self.cleaned_data.get("bg_image_url", None) if bg_image_url: copy_background_image_from_url_to_event( bg_image_url, event, False) event.bg_tile = bool(self.cleaned_data.get("bg_tile", False)) if bg_image: event.bg_image.save("badge-bg", bg_image, save=False) event.creator = user_profile if not inst.pk: event.artist = artist event.url = ( u"%s-%s" % (slugify(event.title)[:30], uuid4().hex[::4]))[:35] if 1 in steps: venue_name = self.cleaned_data.get('venue_name', '').strip() venue_source = self.cleaned_data.get('venue_source', '').strip() venue_params = self.cleaned_data.get('venue_params', '').strip() if venue_params: venue_params = json.loads(venue_params) venue = None inst = self.instance if inst.pk: vn = inst.venue # process venue update if venue_name == vn.name: if venue_params: street = venue_params.get('streetAddress', u'')[:255] city = venue_params.get('city', u'')[:255] region = venue_params.get('region', u'')[:100] uvn = (street, city, region) dbvn = (vn.address, vn.city, vn.state) if uvn == dbvn: venue = vn # venue hasn't changed; retain it else: event._venue_changed = True else: # venue name hasn't changed venue = vn # retain existing venue instance if not venue: event._venue_changed = True if venue_source == 'user-entered': geo_loc = settings.VENUE_DEFAULT_GEO_LOC venue, created = Venue.objects.get_or_create( name=venue_name, geo_loc=geo_loc, defaults=dict(source=venue_source, )) else: # if venue_source == 'google-maps': lat = venue_params['lat'] lng = venue_params['lng'] lat = str(round(float(lat), 3)) lng = str(round(float(lng), 3)) geo_loc = u"%s,%s" % (lat, lng) title = venue_params['titleNoFormatting'] streetAddress = venue_params['streetAddress'] city = venue_params['city'] region = venue_params['region'] url = venue_params['url'] venue, created = Venue.objects.get_or_create( name=title, geo_loc=geo_loc, defaults=dict( source=venue_source, address=streetAddress[:255], city=city[:255], state=region[:100], map_url=url[:255], )) if not created: # and venue.source != 'google-maps': # Update empty fields vn = venue dirty = False if not vn.address: vn.address = streetAddress[:255] dirty = True if not vn.city: vn.city = city[:255] dirty = True if not vn.state: vn.state = region[:100] dirty = True if not vn.map_url: vn.map_url = url[:255] dirty = True if dirty: vn.save() event.venue = venue if not event.image: # Use default image _UI_MEDIA_ROOT = os.path.join(settings.MEDIA_ROOT, settings.UI_ROOT, 'internal') _DEFAULT_IMAGE = os.path.join( _UI_MEDIA_ROOT, settings.EVENT_BADGE_DEFAULT_IMAGE) f = open(_DEFAULT_IMAGE, "rb") img = f.read() f.close() event.image.save("badge", ContentFile(img), save=False) image_changed = True if commit: event.save() if is_new and self.cleaned_data.get('invite_by_email', False): event_created(event) if image_changed or not event.image_resized: try: event._create_resized_images(raw_field=None, save=True) except: # retry once try: event._create_resized_images(raw_field=None, save=True) except Exception, e: _log.warn( "Event image could not be resized. Event: %s - Image: %s", event.pk, event.image) _log.exception(e)
def construct_cache_key(cache_key_prefix, *args, **kwargs): sdict = SortedDict(kwargs) return slugify("%s-%s-%s" % (cache_key_prefix, args, sdict))
def import_events(filepath, hashtag=u"#SXSWm #Showcase", location=u'austin', venue_city='Austin', venue_state='TX', venue_zip=u'', event_source='sxsw', geoloc="30.27,-97.74", **kwargs): from artist.models import ArtistProfile from event.models import Event, Venue from lastfm import get_artist from lastfm.fetch_events import get_raw_image _ARTIST = ArtistProfile.objects.get(url='riotvine-member') _DATE_FORMAT = "%m/%d/%Y" # format: 03/17/2010 f = open(filepath, 'r') lines = f.readlines() max = len(lines) rnum = 0 while True: if rnum >= max: break r = lines[rnum].strip().split('|') print rnum, r if r[1] == u'' and r[2] == u'' and r[3] == u'' and r[4] == u'': # venue row #1 if rnum + 1 >= max: break r2 = lines[rnum + 1].strip().split('|') if r2[1] == u'' and r2[2] == u'' and r2[3] == u'' and r2[4] == u'': # venue row #2 venue = r[0] venue_address = r2[0].split(')\xc2\xa0(')[0][1:].decode( 'utf-8') querystring = urlencode({ 'q': u'%s %s, %s %s' % (venue[:25], venue_address, venue_city, venue_state) }) map_url = u'http://maps.google.com/?%s' % querystring vn, created = Venue.objects.get_or_create( name=venue[:255], geo_loc=geoloc, defaults=dict( source='user-entered', address=venue_address[:255], city=venue_city[:255], state=venue_state, zip_code=venue_zip[:12], venue_url=u'', map_url=map_url, )) rnum += 1 # skip this row next time around else: # event row artist_name = r[1] artist_dictionary = get_artist(artist_name) bio = artist_dictionary.get('bio', {}).get('summary', u'') img = artist_dictionary.get('img', u'') event_date = r[5] # MM/DD/YYYY dt = strptime(event_date, _DATE_FORMAT) event_date = date(*dt[:3]) event_time = r[2] # HH:MM zz" if ':' in event_time: if ' ' in event_time: # convert to 24 hour time format t, z = event_time.split(' ') h, m = t.split(':') if 'p' in z.lower( ) and not event_time.lower() == '12:00 p.m.': h = (int(h) + 12) % 24 event_time = u"%s:%s" % (h, m) elif event_time.lower() == '12:00 a.m.': event_time = u"00:00" event_date = event_date + timedelta(days=1) else: if int(h) <= 2 or int(h) == 12: if int(h) == 12: t = u"00:%s" % m event_date = event_date + timedelta(days=1) event_time = t else: event_time = None if not event_time: event_time = None artist_location = r[3] headliner = artist_name genre = r[4] external_url = r[6].strip() event_id = external_url.split('/')[-1] if 'no hyperlink' in external_url.lower(): external_url = u'' genre_tag = genre.replace('/', ' #') title = u"%s at %s %s #%s" % (artist_name.decode('utf-8'), vn.name.decode('utf-8'), hashtag, genre_tag) Event.objects.filter(ext_event_id=event_id, ext_event_source=event_source).delete() ex = Event( ext_event_id=event_id, ext_event_source=event_source, artist=_ARTIST, creator=_ARTIST.user_profile, description=bio, is_submitted=True, is_approved=True, title=title[:120], url=(u"%s-%s" % (slugify(title)[:30], uuid4().hex[::4]))[:35], venue=vn, event_date=event_date, event_start_time=event_time, event_timezone=u'', hashtag=u'"%s"' % headliner[:200].decode('utf-8') or u'', location=location, headliner=headliner[:200] or u'', artists=u'', has_image=bool(img), ) image_content = ContentFile(get_raw_image(img)) fname, ext = os.path.splitext("default.jpg") fname = u'%s%s' % (uuid4().hex[::2], ext) ex.image.save(fname, image_content, save=False) ex._create_resized_images(raw_field=None, save=False) ex.save() print ex, ex.ext_event_id rnum += 1
def fb_login(request): next = request.REQUEST.get("next", "/") if request.user.is_authenticated(): return HttpResponseRedirect(next) # if user has an FB Connect session, create account and # log the user in. api_key, secret = settings.FB_API_KEY, settings.FB_SECRET_KEY fb_uid, fb_session_key, fb_session_secret = get_fb_session(request) if not fb_uid: return _logout_redirect(request, next) # Create account if necessary new_signup = True try: profile = UserProfile.objects.active().filter( fb_userid=fb_uid)[:1].get() new_signup = False # account exists; log the user in user = profile.user if user.email.startswith("sso+fb_"): # get FB proxied email and save it under this user's record uinfo = get_user_info(api_key, secret, fb_session_key, fb_uid) if uinfo: name, email = uinfo['name'], uinfo['email'] if email: user.email = email user.save() profile.is_sso = False profile.send_reminders = True profile.send_favorites = True profile.save() except UserProfile.DoesNotExist: # create new acount new_signup = True email = request.session.get("email", None) if not email: add_message( request, u"Create a new account below in two easy steps before signing in with Facebook." ) return HttpResponseRedirect(reverse("signup") + "?next=" + next) uinfo = get_user_info(api_key, secret, fb_session_key, fb_uid) # screen_name, name, email = None, None, None screen_name, name = None, None if uinfo: # name, email = uinfo['name'], uinfo['email'] name = uinfo['name'] if name: # screen name is firstname followed by last initial; all lowercased screen_name = name.lower().strip() x = screen_name.split(' ') if len(x) > 1: firstname, lastname = x[0], x[1] if lastname: screen_name = firstname + lastname[0] else: screen_name = firstname screen_name = slugify(screen_name)[:25] unames = list( User.objects.filter( username__istartswith=screen_name).values_list( "username", flat=True).order_by("username")) unames = set([x.lower() for x in unames]) if screen_name in unames: # generate a unique screen_name by suffixing it with a number for n in range(2, 1000): s = u"%s%s" % (screen_name, n) if s not in unames: screen_name = s break if not screen_name: # Use FB User ID as the screen name screen_name = fb_uid if User.objects.filter(username=screen_name).count(): # screen name not available. Generate one with a random suffix screen_name = u''.join( [screen_name.strip()[:25], u'-', uuid4().hex[::6]]) # create user and profile user = User.objects.create( username=screen_name, first_name='', last_name='', email=email or u'*****@*****.**' % uuid4().hex[::5], ) profile = user.get_profile() profile.fb_userid = fb_uid profile.is_sso = False profile.send_reminders = bool(email) profile.send_favorites = bool(email) profile.fb_suggested = 0 profile.save() # annotate the user object with the path of the backend so that # login() works without a password: backend = get_backends()[0] user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__) login(request, user) if new_signup: user.message_set.create( message=_(u'Thank you for signing-up with Facebook!')) _log.debug("FB user %s logged in" % profile.username) request.user_profile = profile request.session['fb_uid'] = fb_uid request.session['fb_session_key'] = fb_session_key # if this user was invited by any existing users, create a friendship inv = FBInvitedUser.objects.select_related('inviter_profile').filter( fb_userid=fb_uid) for u in inv: inviter = u.inviter_profile Friendship.objects.make_friends(inviter, request.user_profile, source='fb') u.delete() # calculate new suggested friends and add their count to session try: user_profile = profile all_fb_friends = _get_connected_friends(api_key, secret, fb_session_key, fb_uid) fb_users = UserProfile.objects.active().exclude(fb_userid=u'') app_friends = set( list( fb_users.filter( friends2__user_profile1__pk=user_profile.pk).values_list( 'fb_userid', flat=True))) pending_friends = set( list( fb_users.filter( pending_friends_inviter__invitee_profile__pk=user_profile. pk).values_list('fb_userid', flat=True))) invited_friends = set( list( fb_users.filter( pending_friends_invitee__inviter_profile__pk=user_profile. pk).values_list('fb_userid', flat=True))) recommended_friends = all_fb_friends.difference( app_friends).difference(pending_friends).difference( invited_friends) db_reco, created = FBSuggestedFriends.objects.get_or_create( user_profile=user_profile) db_recommended_friends = db_reco.friendset new_friends = recommended_friends.difference(db_recommended_friends) if new_friends: if new_signup and settings.FB_AUTO_FRIEND: num_auto_friended = auto_friend(profile, new_friends) _log.debug("Auto-friended %s friends of %s", num_auto_friended, profile) else: request.session['num_fb_new_friends'] = len(new_friends) except Exception, e: _log.exception(e)
def import_parties(filepath, hashtag, location=u'austin', venue_city='Austin', venue_state='TX', venue_zip=u'', event_source='sxsw-party', geoloc="30.27,-97.74", **kwargs): from artist.models import ArtistProfile from event.models import Event, Venue from lastfm import get_artist from lastfm.fetch_events import get_raw_image parent, filename = os.path.split(_DEFAULT_IMAGE) party_images = { '#SXSWi #Party'.lower(): os.path.join(parent, "sxswi_party.jpg"), '#SXSWm #Party'.lower(): os.path.join(parent, "sxswm_party.jpg"), } _ARTIST = ArtistProfile.objects.get(url='riotvine-member') _DATE_FORMAT = "%m/%d/%Y" # format: 03/17/2010 f = open(filepath, 'r') f.readline( ) # skip first line -- Date|Actual Date|Event|Venue|Band|Free|Free Drinks|Map|Details|Link| lines = f.readlines() max = len(lines) rnum = 0 img = party_images.get(hashtag.lower(), None) has_image = True if not img: has_image = False img = _DEFAULT_IMAGE f = open(img, "rb") raw_image_contents = f.read() f.close() while True: if rnum >= max: break r = lines[rnum].strip().split('|') print rnum, r venue = r[3].strip().decode("utf-8").strip() venue_address = u'' querystring = urlencode({ 'q': u'"%s" %s, %s %s' % (venue[:25], venue_address, venue_city, venue_state) }) map_url = u'http://maps.google.com/?%s' % querystring vn, created = Venue.objects.get_or_create( name=venue[:255], geo_loc=geoloc, defaults=dict( source='user-entered', address=venue_address[:255], city=venue_city[:255], state=venue_state, zip_code=venue_zip[:12], venue_url=u'', map_url=map_url, )) event_name = r[2] event_date = r[1] # MM/DD/YYYY if 'err' in event_date.lower(): rnum += 1 continue dt = strptime(event_date, _DATE_FORMAT) event_date = date(*dt[:3]) event_time = None headliner = u'' is_free = r[5] and "y" in r[5].lower() free_drinks = r[6] and "y" in r[6].lower() band = r[4] description = u"" if band and 'tba' not in band.lower(): description = u'<p class="band party party-band">%s</p>' % band.decode( "utf-8") if free_drinks: description = description + u"\n<p><strong>Free Drinks!</strong></p>\n" external_url = r[9].strip() if 'no hyperlink' in external_url.lower(): external_url = u'' event_id = u'' else: x = urlparse.urlsplit(external_url) qx = x.query qx_dict = parse_qs(qx) qx_dict.pop("appSession", None) # remove session id from URL to make it work event_id = qx_dict.get("RecordID")[0] new_dict = {} for k, v in qx_dict.iteritems(): new_dict[k] = v[0] qx = urlencode(new_dict) external_url = urlparse.urlunsplit( (x.scheme, x.netloc, x.path, qx, x.fragment)) description = description + u'\n<p><a href="%s">More details »</a></p>\n' % external_url title = u"%s at %s %s" % (event_name.decode('utf-8'), vn.name.decode('utf-8'), hashtag) Event.objects.filter(ext_event_id=event_id, ext_event_source=event_source).delete() ex = Event( ext_event_id=event_id, ext_event_source=event_source, artist=_ARTIST, creator=_ARTIST.user_profile, description=description, is_submitted=True, is_approved=True, is_free=is_free, title=title[:120], url=(u"%s-%s" % (slugify(title)[:30], uuid4().hex[::4]))[:35], venue=vn, event_date=event_date, event_start_time=event_time, event_timezone=u'', hashtag=u'', location=location, headliner=u'', artists=u'', has_image=has_image, ) image_content = ContentFile(raw_image_contents) fname, ext = os.path.splitext("default.jpg") fname = u'%s%s' % (uuid4().hex[::2], ext) ex.image.save(fname, image_content, save=False) ex._create_resized_images(raw_field=None, save=False) ex.save() print ex, ex.ext_event_id rnum += 1
def fb_login(request): next = request.REQUEST.get("next", "/") if request.user.is_authenticated(): return HttpResponseRedirect(next) # if user has an FB Connect session, create account and # log the user in. api_key, secret = settings.FB_API_KEY, settings.FB_SECRET_KEY fb_uid, fb_session_key, fb_session_secret = get_fb_session(request) if not fb_uid: return _logout_redirect(request, next) # Create account if necessary new_signup = True try: profile = UserProfile.objects.active().filter(fb_userid=fb_uid)[:1].get() new_signup = False # account exists; log the user in user = profile.user if user.email.startswith("sso+fb_"): # get FB proxied email and save it under this user's record uinfo = get_user_info(api_key, secret, fb_session_key, fb_uid) if uinfo: name, email = uinfo['name'], uinfo['email'] if email: user.email = email user.save() profile.is_sso = False profile.send_reminders = True profile.send_favorites = True profile.save() except UserProfile.DoesNotExist: # create new acount new_signup = True email = request.session.get("email", None) if not email: add_message(request, u"Create a new account below in two easy steps before signing in with Facebook.") return HttpResponseRedirect(reverse("signup") + "?next=" + next) uinfo = get_user_info(api_key, secret, fb_session_key, fb_uid) # screen_name, name, email = None, None, None screen_name, name = None, None if uinfo: # name, email = uinfo['name'], uinfo['email'] name = uinfo['name'] if name: # screen name is firstname followed by last initial; all lowercased screen_name = name.lower().strip() x = screen_name.split(' ') if len(x) > 1: firstname, lastname = x[0], x[1] if lastname: screen_name = firstname + lastname[0] else: screen_name = firstname screen_name = slugify(screen_name)[:25] unames = list(User.objects.filter(username__istartswith=screen_name).values_list("username", flat=True).order_by("username")) unames = set([x.lower() for x in unames]) if screen_name in unames: # generate a unique screen_name by suffixing it with a number for n in range(2, 1000): s = u"%s%s" % (screen_name, n) if s not in unames: screen_name = s break if not screen_name: # Use FB User ID as the screen name screen_name = fb_uid if User.objects.filter(username=screen_name).count(): # screen name not available. Generate one with a random suffix screen_name = u''.join([screen_name.strip()[:25], u'-', uuid4().hex[::6]]) # create user and profile user = User.objects.create( username=screen_name, first_name='', last_name='', email=email or u'*****@*****.**' % uuid4().hex[::5], ) profile = user.get_profile() profile.fb_userid = fb_uid profile.is_sso = False profile.send_reminders = bool(email) profile.send_favorites = bool(email) profile.fb_suggested = 0 profile.save() # annotate the user object with the path of the backend so that # login() works without a password: backend = get_backends()[0] user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__) login(request, user) if new_signup: user.message_set.create(message=_(u'Thank you for signing-up with Facebook!')) _log.debug("FB user %s logged in" % profile.username) request.user_profile = profile request.session['fb_uid'] = fb_uid request.session['fb_session_key'] = fb_session_key # if this user was invited by any existing users, create a friendship inv = FBInvitedUser.objects.select_related('inviter_profile').filter(fb_userid=fb_uid) for u in inv: inviter = u.inviter_profile Friendship.objects.make_friends(inviter, request.user_profile, source='fb') u.delete() # calculate new suggested friends and add their count to session try: user_profile = profile all_fb_friends = _get_connected_friends(api_key, secret, fb_session_key, fb_uid) fb_users = UserProfile.objects.active().exclude(fb_userid=u'') app_friends = set(list(fb_users.filter(friends2__user_profile1__pk=user_profile.pk).values_list('fb_userid', flat=True))) pending_friends = set(list(fb_users.filter(pending_friends_inviter__invitee_profile__pk=user_profile.pk).values_list('fb_userid', flat=True))) invited_friends = set(list(fb_users.filter(pending_friends_invitee__inviter_profile__pk=user_profile.pk).values_list('fb_userid', flat=True))) recommended_friends = all_fb_friends.difference(app_friends).difference(pending_friends).difference(invited_friends) db_reco, created = FBSuggestedFriends.objects.get_or_create(user_profile=user_profile) db_recommended_friends = db_reco.friendset new_friends = recommended_friends.difference(db_recommended_friends) if new_friends: if new_signup and settings.FB_AUTO_FRIEND: num_auto_friended = auto_friend(profile, new_friends) _log.debug("Auto-friended %s friends of %s", num_auto_friended, profile) else: request.session['num_fb_new_friends'] = len(new_friends) except Exception, e: _log.exception(e)
def save(self, commit=True): event = super(EventForm, self).save(commit=False) inst = self.instance is_new = not inst.pk if not inst.pk: event.location = self.location event.is_member_generated = not user_profile.is_artist image_changed = False img = self.cleaned_data.get("image", None) if img: event.image.save("badge", img, save=False) image_changed = True bg_image = self.cleaned_data.get("bg_image", None) if not bg_image and self.cleaned_data.get("use_twitter_background", False): bg_image_url = self.cleaned_data.get("bg_image_url", None) if bg_image_url: copy_background_image_from_url_to_event(bg_image_url, event, False) event.bg_tile = bool(self.cleaned_data.get("bg_tile", False)) if bg_image: event.bg_image.save("badge-bg", bg_image, save=False) event.creator = user_profile if not inst.pk: event.artist = artist event.url = (u"%s-%s" % (slugify(event.title)[:30], uuid4().hex[::4]))[:35] if 1 in steps: venue_name = self.cleaned_data.get("venue_name", "").strip() venue_source = self.cleaned_data.get("venue_source", "").strip() venue_params = self.cleaned_data.get("venue_params", "").strip() if venue_params: venue_params = json.loads(venue_params) venue = None inst = self.instance if inst.pk: vn = inst.venue # process venue update if venue_name == vn.name: if venue_params: street = venue_params.get("streetAddress", u"")[:255] city = venue_params.get("city", u"")[:255] region = venue_params.get("region", u"")[:100] uvn = (street, city, region) dbvn = (vn.address, vn.city, vn.state) if uvn == dbvn: venue = vn # venue hasn't changed; retain it else: event._venue_changed = True else: # venue name hasn't changed venue = vn # retain existing venue instance if not venue: event._venue_changed = True if venue_source == "user-entered": geo_loc = settings.VENUE_DEFAULT_GEO_LOC venue, created = Venue.objects.get_or_create( name=venue_name, geo_loc=geo_loc, defaults=dict(source=venue_source) ) else: # if venue_source == 'google-maps': lat = venue_params["lat"] lng = venue_params["lng"] lat = str(round(float(lat), 3)) lng = str(round(float(lng), 3)) geo_loc = u"%s,%s" % (lat, lng) title = venue_params["titleNoFormatting"] streetAddress = venue_params["streetAddress"] city = venue_params["city"] region = venue_params["region"] url = venue_params["url"] venue, created = Venue.objects.get_or_create( name=title, geo_loc=geo_loc, defaults=dict( source=venue_source, address=streetAddress[:255], city=city[:255], state=region[:100], map_url=url[:255], ), ) if not created: # and venue.source != 'google-maps': # Update empty fields vn = venue dirty = False if not vn.address: vn.address = streetAddress[:255] dirty = True if not vn.city: vn.city = city[:255] dirty = True if not vn.state: vn.state = region[:100] dirty = True if not vn.map_url: vn.map_url = url[:255] dirty = True if dirty: vn.save() event.venue = venue if not event.image: # Use default image _UI_MEDIA_ROOT = os.path.join(settings.MEDIA_ROOT, settings.UI_ROOT, "internal") _DEFAULT_IMAGE = os.path.join(_UI_MEDIA_ROOT, settings.EVENT_BADGE_DEFAULT_IMAGE) f = open(_DEFAULT_IMAGE, "rb") img = f.read() f.close() event.image.save("badge", ContentFile(img), save=False) image_changed = True if commit: event.save() if is_new and self.cleaned_data.get("invite_by_email", False): event_created(event) if image_changed or not event.image_resized: try: event._create_resized_images(raw_field=None, save=True) except: # retry once try: event._create_resized_images(raw_field=None, save=True) except Exception, e: _log.warn("Event image could not be resized. Event: %s - Image: %s", event.pk, event.image) _log.exception(e)
def import_mlb(filepath, metapath, event_source='mlb2010', geo_loc="42.63699,-71.549835", limit=100000, **kwargs): import csv import Image, ImageFont, ImageDraw from django.contrib.auth.models import User from django.db.models import signals from artist.models import ArtistProfile from event.models import Event, Venue, Attendee, Stats, recompute_event_stats from rdutils.image import get_raw_png_image, resize_in_memory, get_perfect_fit_resize_crop, remove_model_image, close, get_raw_image, str_to_file from registration.utils import copy_avatar_from_file_to_profile print "Script has been disabled to prevent accidental execution :)" return False signals.post_save.disconnect(recompute_event_stats, sender=Attendee) signals.post_delete.disconnect(recompute_event_stats, sender=Attendee) # clear old data first ''' print "Deleting stats" Stats.objects.filter(event__ext_event_source=event_source).delete() # delete existing stats Stats.objects.filter(event__ext_event_source=event_source).delete() print "Deleting events" Event.objects.filter(ext_event_source=event_source).delete() # delete existing events first print "Deleting users" User.objects.filter(first_name='MLB', last_name='Team', email__endswith='@riotvine.com').delete() # delete existing users ''' colormap = { # 'navy':'#2E2EFE', 'red': '#DD0000', } secondary_colormap = {} _ARTIST = ArtistProfile.objects.get(url='riotvine-member') _DATE_FORMAT = "%m/%d/%y" # format: 03/17/10 _TIME_FORMAT = "%H:%M:%S %p"# format: 11:05:00 AM parent, filename = os.path.split(_DEFAULT_IMAGE) profilepath = os.path.join(parent, "baseball.jpg") eventbgpath = os.path.join(parent, "baseball_background.png") # load team meta info team = {} reader = csv.reader(open(metapath, "rb")) for row in reader: print row username = row[6].replace(' ', '') team_name = row[0].strip() hashtags = ", ".join(row[5].strip().split("~")) tz = row[7].strip() # create venue venue = row[2].decode("utf-8").strip() venue_address = u'' venue_city, venue_state = row[1].decode("utf-8").strip().split(",") venue_city, venue_state = venue_city.strip(), venue_state.strip() querystring = urlencode({'q':u'"%s" %s, %s %s' % (venue[:25], venue_address, venue_city, venue_state)}) map_url = u'http://maps.google.com/?%s' % querystring vn, created = Venue.objects.get_or_create( name=venue[:255], geo_loc=geo_loc, source='mlb', defaults=dict( source='mlb', address=venue_address[:255], city=venue_city[:255], state=venue_state, zip_code=u'', venue_url=u'', map_url=map_url, ) ) # create user a, created = User.objects.get_or_create( username=username, defaults = dict( first_name='MLB', last_name='Team', email='*****@*****.**' % username.lower(), is_staff=False, is_active=True ) ) user_profile = a.get_profile() user_profile.send_reminders = False user_profile.send_favorites = False is_verified = True user_profile.save() copy_avatar_from_file_to_profile(profilepath, user_profile) team[team_name.lower()] = { 'name':team_name, 'venue':vn, 'pri-color':colormap.get(row[3].lower(), row[3]), 'sec-color':secondary_colormap.get(row[4].lower(), row[4]), 'user':user_profile, 'tz':tz, 'hashtags':hashtags, } print "Loading schedule" # load schedule description = u''' <p class="mlb"> <a href="/sports/baseball/2010/">Baseball 2010 »</a> </p> ''' reader = csv.reader(open(filepath, "rb")) num = 0 for row in reader: num += 1 print num, row dt, title, loc, ptime, mtime, ctime, etime = row # get road and home road, home = title.split(' at ') road, home = road.strip(), home.strip() roadvars = team[road.lower()] homevars = team[home.lower()] roaduser, homeuser = roadvars['user'], homevars['user'] roadcolors = roadvars['pri-color'], roadvars['sec-color'] homecolors = homevars['pri-color'], homevars['sec-color'] hashtags = homevars['hashtags'] # generate 211x211 badge raw_image_contents = None bg = Image.new("RGB", (211, 211), homecolors[1]) # background is the sec color of home team bgimg = Image.open(eventbgpath) bg.paste(bgimg, (0, 0)) t = ImageDraw.Draw(bg) # Road team name x, y = settings.SPORTS_TEAM_TEXT_START font = ImageFont.truetype(settings.SPORTS_TEAM_TEXT_FONT, settings.SPORTS_TEAM_TEXT_FONT_SIZE, encoding='unic') tx = roadvars['name'] w,h = t.textsize(tx, font=font) x = (211 - w)/2 # center align col = roadcolors[0] # (homecolors[1] == roadcolors[0]) and roadcolors[1] or roadcolors[0] t.text((x, y), tx, font=font, fill=col) # Text = at x, y = x, y + settings.SPORTS_TEAM_TEXT_FONT_SIZE + 10 font = ImageFont.truetype(settings.SPORTS_TEAM_TEXT_FONT, settings.SPORTS_TEAM_TEXT_SMALL_FONT_SIZE, encoding='unic') tx = 'at' w,h = t.textsize(tx, font=font) x = (211 - w)/2 # center align t.text((x, y), tx, font=font, fill='#333333') # Home team name x, y = x, y + settings.SPORTS_TEAM_TEXT_SMALL_FONT_SIZE + 10 font = ImageFont.truetype(settings.SPORTS_TEAM_TEXT_FONT, settings.SPORTS_TEAM_TEXT_FONT_SIZE, encoding='unic') tx = homevars['name'] w,h = t.textsize(tx, font=font) x = (211 - w)/2 # center align t.text((x, y), tx, font=font, fill=homecolors[0]) raw_image_contents = get_raw_png_image(bg) # get venue vn = homevars['venue'] location = settings.STATE_TO_LOCATION_MAP.get(vn.state.lower(), 'user-entered') city_state = u'%s|%s' % (vn.city, vn.state) location = settings.CITY_STATE_TO_LOCATION_MAP.get(city_state.lower(), location) # special cases for locations if vn.state == 'NJ': location = 'user-defined' dt = strptime(dt, _DATE_FORMAT) event_date = date(*dt[:3]) tz = homevars['tz'] if tz == 'ET': xtime = etime elif tz == 'CT': xtime = ctime elif tz == 'MT': xtime = mtime elif tz == 'PT': xtime = ptime else: xtime = etime # default timezone is ET tt = strptime(xtime.strip(), _TIME_FORMAT) h, m = tt.tm_hour, tt.tm_min if 'PM' in etime.upper() and h < 12: h = h + 12 event_time = u"%s:%s" % (h, m) title = u"%s! %s" % (title, event_date.strftime("%m/%d")) # save event ex = Event( ext_event_id="999", ext_event_source=event_source, artist=_ARTIST, creator=homeuser, description=description, is_submitted=True, is_approved=True, is_free=False, title=title[:120], url=(u"%s-%s" % (slugify(title)[:30], uuid4().hex[::4]))[:35], venue=vn, event_date=event_date, event_start_time=event_time, event_timezone=tz, hashtag=hashtags, location=location, headliner=u'', artists=u'', has_image=True, ) image_content = ContentFile(raw_image_contents) fname, ext = os.path.splitext("default.jpg") fname = u'%s%s' % (uuid4().hex[::2], ext) ex.image.save(fname, image_content, save=False) ex._create_resized_images(raw_field=None, save=False) ex.save() # favorite event for home users ex.attendee_set.get_or_create(attendee_profile=homeuser) # ex.attendee_set.get_or_create(attendee_profile=roaduser) if num > limit: return
def import_events(filepath, hashtag=u"#SXSWm #Showcase", location=u'austin', venue_city='Austin', venue_state='TX', venue_zip=u'', event_source='sxsw', geoloc="30.27,-97.74", **kwargs): from artist.models import ArtistProfile from event.models import Event, Venue from lastfm import get_artist from lastfm.fetch_events import get_raw_image _ARTIST = ArtistProfile.objects.get(url='riotvine-member') _DATE_FORMAT = "%m/%d/%Y" # format: 03/17/2010 f = open(filepath, 'r') lines = f.readlines() max = len(lines) rnum = 0 while True: if rnum >= max: break r = lines[rnum].strip().split('|') print rnum, r if r[1] == u'' and r[2] == u'' and r[3] == u'' and r[4] == u'': # venue row #1 if rnum + 1 >= max: break r2 = lines[rnum+1].strip().split('|') if r2[1] == u'' and r2[2] == u'' and r2[3] == u'' and r2[4] == u'': # venue row #2 venue = r[0] venue_address = r2[0].split(')\xc2\xa0(')[0][1:].decode('utf-8') querystring = urlencode({'q':u'%s %s, %s %s' % (venue[:25], venue_address, venue_city, venue_state)}) map_url = u'http://maps.google.com/?%s' % querystring vn, created = Venue.objects.get_or_create( name=venue[:255], geo_loc=geoloc, defaults=dict( source='user-entered', address=venue_address[:255], city=venue_city[:255], state=venue_state, zip_code=venue_zip[:12], venue_url=u'', map_url=map_url, ) ) rnum += 1 # skip this row next time around else: # event row artist_name = r[1] artist_dictionary = get_artist(artist_name) bio = artist_dictionary.get('bio', {}).get('summary', u'') img = artist_dictionary.get('img', u'') event_date = r[5] # MM/DD/YYYY dt = strptime(event_date, _DATE_FORMAT) event_date = date(*dt[:3]) event_time = r[2] # HH:MM zz" if ':' in event_time: if ' ' in event_time: # convert to 24 hour time format t, z = event_time.split(' ') h, m = t.split(':') if 'p' in z.lower() and not event_time.lower() == '12:00 p.m.': h = (int(h) + 12) % 24 event_time = u"%s:%s" % (h, m) elif event_time.lower() == '12:00 a.m.': event_time = u"00:00" event_date = event_date + timedelta(days=1) else: if int(h) <= 2 or int(h) == 12: if int(h) == 12: t = u"00:%s" % m event_date = event_date + timedelta(days=1) event_time = t else: event_time = None if not event_time: event_time = None artist_location = r[3] headliner = artist_name genre = r[4] external_url = r[6].strip() event_id = external_url.split('/')[-1] if 'no hyperlink' in external_url.lower(): external_url = u'' genre_tag = genre.replace('/', ' #') title = u"%s at %s %s #%s" % (artist_name.decode('utf-8'), vn.name.decode('utf-8'), hashtag, genre_tag) Event.objects.filter(ext_event_id=event_id, ext_event_source=event_source).delete() ex = Event( ext_event_id=event_id, ext_event_source=event_source, artist=_ARTIST, creator=_ARTIST.user_profile, description=bio, is_submitted=True, is_approved=True, title=title[:120], url=(u"%s-%s" % (slugify(title)[:30], uuid4().hex[::4]))[:35], venue=vn, event_date=event_date, event_start_time=event_time, event_timezone=u'', hashtag=u'"%s"' % headliner[:200].decode('utf-8') or u'', location=location, headliner=headliner[:200] or u'', artists=u'', has_image=bool(img), ) image_content = ContentFile(get_raw_image(img)) fname, ext = os.path.splitext("default.jpg") fname = u'%s%s' % (uuid4().hex[::2], ext) ex.image.save(fname, image_content, save=False) ex._create_resized_images(raw_field=None, save=False) ex.save() print ex, ex.ext_event_id rnum += 1
def import_mlb(filepath, metapath, event_source='mlb2010', geo_loc="42.63699,-71.549835", limit=100000, **kwargs): import csv import Image, ImageFont, ImageDraw from django.contrib.auth.models import User from django.db.models import signals from artist.models import ArtistProfile from event.models import Event, Venue, Attendee, Stats, recompute_event_stats from rdutils.image import get_raw_png_image, resize_in_memory, get_perfect_fit_resize_crop, remove_model_image, close, get_raw_image, str_to_file from registration.utils import copy_avatar_from_file_to_profile print "Script has been disabled to prevent accidental execution :)" return False signals.post_save.disconnect(recompute_event_stats, sender=Attendee) signals.post_delete.disconnect(recompute_event_stats, sender=Attendee) # clear old data first ''' print "Deleting stats" Stats.objects.filter(event__ext_event_source=event_source).delete() # delete existing stats Stats.objects.filter(event__ext_event_source=event_source).delete() print "Deleting events" Event.objects.filter(ext_event_source=event_source).delete() # delete existing events first print "Deleting users" User.objects.filter(first_name='MLB', last_name='Team', email__endswith='@riotvine.com').delete() # delete existing users ''' colormap = { # 'navy':'#2E2EFE', 'red': '#DD0000', } secondary_colormap = {} _ARTIST = ArtistProfile.objects.get(url='riotvine-member') _DATE_FORMAT = "%m/%d/%y" # format: 03/17/10 _TIME_FORMAT = "%H:%M:%S %p" # format: 11:05:00 AM parent, filename = os.path.split(_DEFAULT_IMAGE) profilepath = os.path.join(parent, "baseball.jpg") eventbgpath = os.path.join(parent, "baseball_background.png") # load team meta info team = {} reader = csv.reader(open(metapath, "rb")) for row in reader: print row username = row[6].replace(' ', '') team_name = row[0].strip() hashtags = ", ".join(row[5].strip().split("~")) tz = row[7].strip() # create venue venue = row[2].decode("utf-8").strip() venue_address = u'' venue_city, venue_state = row[1].decode("utf-8").strip().split(",") venue_city, venue_state = venue_city.strip(), venue_state.strip() querystring = urlencode({ 'q': u'"%s" %s, %s %s' % (venue[:25], venue_address, venue_city, venue_state) }) map_url = u'http://maps.google.com/?%s' % querystring vn, created = Venue.objects.get_or_create( name=venue[:255], geo_loc=geo_loc, source='mlb', defaults=dict( source='mlb', address=venue_address[:255], city=venue_city[:255], state=venue_state, zip_code=u'', venue_url=u'', map_url=map_url, )) # create user a, created = User.objects.get_or_create( username=username, defaults=dict(first_name='MLB', last_name='Team', email='*****@*****.**' % username.lower(), is_staff=False, is_active=True)) user_profile = a.get_profile() user_profile.send_reminders = False user_profile.send_favorites = False is_verified = True user_profile.save() copy_avatar_from_file_to_profile(profilepath, user_profile) team[team_name.lower()] = { 'name': team_name, 'venue': vn, 'pri-color': colormap.get(row[3].lower(), row[3]), 'sec-color': secondary_colormap.get(row[4].lower(), row[4]), 'user': user_profile, 'tz': tz, 'hashtags': hashtags, } print "Loading schedule" # load schedule description = u''' <p class="mlb"> <a href="/sports/baseball/2010/">Baseball 2010 »</a> </p> ''' reader = csv.reader(open(filepath, "rb")) num = 0 for row in reader: num += 1 print num, row dt, title, loc, ptime, mtime, ctime, etime = row # get road and home road, home = title.split(' at ') road, home = road.strip(), home.strip() roadvars = team[road.lower()] homevars = team[home.lower()] roaduser, homeuser = roadvars['user'], homevars['user'] roadcolors = roadvars['pri-color'], roadvars['sec-color'] homecolors = homevars['pri-color'], homevars['sec-color'] hashtags = homevars['hashtags'] # generate 211x211 badge raw_image_contents = None bg = Image.new( "RGB", (211, 211), homecolors[1]) # background is the sec color of home team bgimg = Image.open(eventbgpath) bg.paste(bgimg, (0, 0)) t = ImageDraw.Draw(bg) # Road team name x, y = settings.SPORTS_TEAM_TEXT_START font = ImageFont.truetype(settings.SPORTS_TEAM_TEXT_FONT, settings.SPORTS_TEAM_TEXT_FONT_SIZE, encoding='unic') tx = roadvars['name'] w, h = t.textsize(tx, font=font) x = (211 - w) / 2 # center align col = roadcolors[ 0] # (homecolors[1] == roadcolors[0]) and roadcolors[1] or roadcolors[0] t.text((x, y), tx, font=font, fill=col) # Text = at x, y = x, y + settings.SPORTS_TEAM_TEXT_FONT_SIZE + 10 font = ImageFont.truetype(settings.SPORTS_TEAM_TEXT_FONT, settings.SPORTS_TEAM_TEXT_SMALL_FONT_SIZE, encoding='unic') tx = 'at' w, h = t.textsize(tx, font=font) x = (211 - w) / 2 # center align t.text((x, y), tx, font=font, fill='#333333') # Home team name x, y = x, y + settings.SPORTS_TEAM_TEXT_SMALL_FONT_SIZE + 10 font = ImageFont.truetype(settings.SPORTS_TEAM_TEXT_FONT, settings.SPORTS_TEAM_TEXT_FONT_SIZE, encoding='unic') tx = homevars['name'] w, h = t.textsize(tx, font=font) x = (211 - w) / 2 # center align t.text((x, y), tx, font=font, fill=homecolors[0]) raw_image_contents = get_raw_png_image(bg) # get venue vn = homevars['venue'] location = settings.STATE_TO_LOCATION_MAP.get(vn.state.lower(), 'user-entered') city_state = u'%s|%s' % (vn.city, vn.state) location = settings.CITY_STATE_TO_LOCATION_MAP.get( city_state.lower(), location) # special cases for locations if vn.state == 'NJ': location = 'user-defined' dt = strptime(dt, _DATE_FORMAT) event_date = date(*dt[:3]) tz = homevars['tz'] if tz == 'ET': xtime = etime elif tz == 'CT': xtime = ctime elif tz == 'MT': xtime = mtime elif tz == 'PT': xtime = ptime else: xtime = etime # default timezone is ET tt = strptime(xtime.strip(), _TIME_FORMAT) h, m = tt.tm_hour, tt.tm_min if 'PM' in etime.upper() and h < 12: h = h + 12 event_time = u"%s:%s" % (h, m) title = u"%s! %s" % (title, event_date.strftime("%m/%d")) # save event ex = Event( ext_event_id="999", ext_event_source=event_source, artist=_ARTIST, creator=homeuser, description=description, is_submitted=True, is_approved=True, is_free=False, title=title[:120], url=(u"%s-%s" % (slugify(title)[:30], uuid4().hex[::4]))[:35], venue=vn, event_date=event_date, event_start_time=event_time, event_timezone=tz, hashtag=hashtags, location=location, headliner=u'', artists=u'', has_image=True, ) image_content = ContentFile(raw_image_contents) fname, ext = os.path.splitext("default.jpg") fname = u'%s%s' % (uuid4().hex[::2], ext) ex.image.save(fname, image_content, save=False) ex._create_resized_images(raw_field=None, save=False) ex.save() # favorite event for home users ex.attendee_set.get_or_create(attendee_profile=homeuser) # ex.attendee_set.get_or_create(attendee_profile=roaduser) if num > limit: return