class UserProfile(TimestampedModel): user = models.OneToOneField(User, related_name='profile') slug = AutoSlugField(populate_from=lambda instance:instance.user.username, always_update=True, slugify=lambda value: value.replace(' ', '-')) about = models.TextField(null=True, blank=True) location_address = models.CharField(max_length=255, null=True, blank=True) ip_location = models.CharField(max_length=255, null=True, blank=True) city = models.CharField(max_length=100, null=True, blank=True) state = models.CharField(max_length=50,null=True, blank=True) country = CountryField(null=True, blank=True) zipcode = models.CharField(max_length=10, null=True, blank=True) region = models.CharField(max_length=50, null=True, blank=True) latitude = models.FloatField(null=True, blank=True) longitude = models.FloatField(null=True, blank=True) timezone = TimeZoneField(null=False, blank=False, default='UTC') website = models.CharField(max_length=100, null=True, blank=True) main_image = ImageField(upload_to='account_images/', blank=True) thumbnail_image = ImageField(upload_to='account_images/', blank=True) followed = models.ManyToManyField('account.UserProfile', null=True, blank=True, related_name='followed_profiles', verbose_name='Profile followed by') activationtoken = models.CharField(max_length=255L, db_column='activationToken', null=True, blank=True) def get_full_name(self): full_name = self.user.get_full_name() or self.user.username return full_name full_name = property(get_full_name) def get_thumbnail(self, size, size2): if self.thumbnail_image: # TODO: refactor try: imgObject = get_thumbnail(self.thumbnail_image, str(size)+'x'+str(size2), crop='center', quality=99) except: return "" urlImg = imgObject.url return urlImg def get_main_image(self,size,size2): # TODO: refactor if self.main_image: try: imgObject = get_thumbnail(self.main_image, str(size)+'x'+str(size2), crop='center', quality=99) except: return "" urlImg = imgObject.url return urlImg
class WorkBidder(models.Model): title = models.CharField(_('title'), max_length=80, blank=True, null=True) poll = models.ForeignKey(Poll, related_name='workbidders') author_name = models.CharField(_('author name'), max_length=80, blank=True, null=True) photo = ImageField(upload_to=make_poll_upload_path) text = tinymce_models.HTMLField(_('text'), blank=True, null=True) #user_likes = models.ManyToManyField(User, verbose_name=_('number votes'), # blank=True, null=True) total_likes = models.PositiveIntegerField(_('number of votes'), default=0) search = SphinxSearch( index='workbidder_index', weights={ 'title': 100, }, mode='SPH_MATCH_ALL', rankmode='SPH_RANK_NONE', ) class Meta: ordering = ['-total_likes'] verbose_name = _('work bidder') verbose_name_plural = _('work bidders') def __unicode__(self): return u'%s - %s' % (self.poll, self.title)
class User(AbstractUser): first_name = None last_name = None name = models.CharField(max_length=100, blank=True) nationality = CountryField(blank=True, null=True) profile_image = ImageField(upload_to=RenamedPath('profile_images', 'user'), blank=True, null=True) preferred_language = models.CharField(max_length=2, choices=LANGUAGES, default='en') is_expert = models.BooleanField(default=False) learning_languages = models.ManyToManyField( Language, through='transcription.Proficiency') class Meta: db_table = 'User' def save(self, *args, **kwargs): if self.id is None: profile_image = self.profile_image self.profile_image = None super().save(*args, **kwargs) self.profile_image = profile_image super().save(*args, **kwargs) def get_full_name(self): return self.name
class Genus(models.Model, UrlNameMixin): objects = GenusManager() genus_id = models.AutoField(primary_key=True) kingdom = models.ForeignKey(Kingdom) latin_name = models.CharField(max_length=30, unique=True) name = models.CharField(max_length=30) featured_image = ImageField(upload_to='featured-images', blank=True, null=True) generated_name = models.CharField(max_length=60, unique=True, blank=True, null=True) class Meta: ordering = ('generated_name', ) def save(self, *args, **kwargs): self.generated_name = self.__get_generated_name() return super(Genus, self).save(*args, **kwargs) def __str__(self): return self.generated_name or self.__get_generated_name() def __get_generated_name(self): return '{0} ({1})'.format(self.name, self.latin_name)
class Keyword(models.Model): label = ValidXMLCharField( _(u'label'), max_length=30, unique=True, db_index=True, help_text= _(u'Select keywords in case you are using an Akvo Page. Keywords linked to a ' u'project will determine if a project appears on the Akvo Page or not.' )) logo = ImageField( _('logo'), blank=True, upload_to=logo_path, help_text= _(u'Add your keyword logo here. You can only add one logo. ' u'The logo will be shown on the project page, but not on Akvo Pages.<br/>' u'The logo should be about 1 MB in size, and should preferably be 75x75 ' u'pixels and in PNG or JPG format.'), ) def __unicode__(self): return self.label class Meta: app_label = 'rsr' ordering = ('label', ) verbose_name = _(u'keyword') verbose_name_plural = _(u'keywords')
class Advertisement(ImageThumbnailMixin, TimeStampedModel): image_file_field_name = 'file' name = models.CharField(max_length=128, verbose_name=_('Name')) file = ImageField(upload_to='ads/%Y/%m/%d', verbose_name=_('File')) type = FSMField(choices=ADS_TYPE_CHOICES, default=ADS_TYPE.external, verbose_name=_('Type')) dish = models.ForeignKey('dishes.Dish', on_delete=models.SET_NULL, default=None, null=True, blank=True, related_name=_('advertisements')) is_active = models.BooleanField(default=True, verbose_name=_('Active?')) class Meta: ordering = ('-modified', ) verbose_name = _('Advertisement') verbose_name_plural = _('Advertisements') def __str__(self): return "<%s(%d): %s>" % (_('Ads'), self.pk, self.name) @property def url(self): return self.file.url
class DishImage(ImageThumbnailMixin, TimeStampedModel): image_file_field_name = 'file' dish = models.ForeignKey( Dish, on_delete=models.CASCADE, related_name='images', verbose_name=_('Dish')) file = ImageField( upload_to='dishes/%Y/%m/%d', verbose_name=_('Image File')) class Meta: ordering = ('-modified', ) verbose_name = _('Dish Image') verbose_name_plural = _('Dish Images') def save(self): # watermark = Image.open(settings.WATERMARK_IMAGE) # base_image = Image.open(self.file) # base_image.paste(watermark, (40, 20)) # output = BytesIO() # base_image.save(output, format='PNG', quality=75) # output.seek(0) # self.file = File(output, self.file.name) return super(DishImage, self).save() def __str__(self): return self.file.url def to_json(self): return { 'tiny': self.tiny, 'small': self.small, 'normal': self.normal, 'big': self.big, }
class InlineImage(models.Model): image = ImageField( _('afbeelding'), upload_to=generate_filename, width_field='image_width', height_field='image_height') image_width = models.PositiveIntegerField( _('afbeelding breedte'), null=True, blank=True, editable=False) image_height = models.PositiveIntegerField( _('afbeelding hoogte'), null=True, blank=True, editable=False) alt_text = models.CharField( _('afbeelding omschrijving'), max_length=120, help_text=_('Omschrijf hier wat er te zien is op de afbeelding.')) caption = models.CharField( _('onderschrift'), max_length=2048, blank=True, help_text=_('Dit is een optionele tekst dat onder de afbeelding ' 'getoond zal worden.')) url = models.URLField(_('URL'), max_length=2000, blank=True) class Meta: abstract = True verbose_name = _('losse afbeelding') verbose_name_plural = _('losse afbeeldingen') ordering = ('pk',) def __str__(self): return self.alt_text @property def upload_to(self): return 'inline-images/%Y/%m/%d/'
class CustomUser(AbstractUser): avatar = ImageField(upload_to=settings.PROFILE_UPLOAD_PATH, blank=True, null=True) subscription = models.CharField(max_length=1, blank=True, null=True) location = models.CharField(max_length=30, blank=True, null=True) about = models.TextField(max_length=1000, blank=True, null=True) USEREMAIL_FIELD = 'email' objects = CustomUserManager()
class SpeciesImage(models.Model): species_image_id = models.AutoField(primary_key=True) species = models.ForeignKey(Species) image = ImageField(upload_to='species-images') name = models.CharField(max_length=20) description = models.CharField(max_length=300, blank=True, null=True) def __str__(self): return self.name
class Child(models.Model): RELATIONSHIP_TYPES = [ ('F', '아버지'), ('M', '어머니'), ('GF', '할아버지'), ('GM', '할머니'), ('O', '기타'), ] GENDER_OPTIONS = [ ('M', '남'), ('F', '여'), ] name = models.CharField( verbose_name='이름', max_length=50, ) gender = models.CharField( verbose_name='성별', max_length=1, choices=GENDER_OPTIONS, ) assigned_class = models.ForeignKey( to=Class, verbose_name='반', related_name='children', ) birthday = models.DateField() address = models.CharField( verbose_name='주소', max_length=100, blank=True, null=True, ) parent_relationship = models.CharField( verbose_name='관계', max_length=2, choices=RELATIONSHIP_TYPES, ) parent_phone_number = PhoneNumberField( verbose_name='휴대폰 번호', ) profile_photo = ImageField( verbose_name='프로필 사진', upload_to='profiles', blank=True, null=True, ) class Meta: verbose_name = '학생' verbose_name_plural = '학생' def __str__(self): return self.name
class ProjectUpdatePhoto(models.Model): update = models.ForeignKey('ProjectUpdate', on_delete=models.CASCADE, related_name='photos') photo = ImageField(_('photo'), upload_to=update_image_path, help_text=_( 'The image should have 4:3 height:width ratio for best displaying result')) caption = ValidXMLTextField(_('photo caption'), blank=True) credit = ValidXMLTextField(_('photo credit'), blank=True) class Meta: app_label = 'rsr' ordering = ['id']
class Winner(models.Model): fio = models.CharField(_('FIO'), max_length=255) photo = ImageField(upload_to=make_winner_upload_path, null=True, blank=True) big_photo = ImageField(upload_to=make_winner_upload_path, null=True, blank=True) dt = models.DateField(_('date'), null=True, blank=True) action = models.ForeignKey(Action, related_name='winners') description = models.TextField(_('short text for description'), null=True, blank=True) class Meta: ordering = ['-dt'] def __unicode__(self): return self.fio
class FocusArea(models.Model): name = ValidXMLCharField( _('focus area name'), max_length=50, help_text=_( 'The name of the focus area. This will show as the title of the focus area project ' 'listing page. (30 characters).')) slug = models.SlugField( _('slug'), max_length=50, db_index=True, help_text= _('Enter the "slug" i.e. a short word or hyphenated-words. This will be used in the ' 'URL of the focus area project listing page. (20 characters, only lower case letters, ' 'numbers, hyphen and underscore allowed.).')) description = ValidXMLTextField( _('description'), max_length=500, help_text=_( 'Enter the text that will appear on the focus area project listing page. ' '(500 characters).')) image = ImageField( _('focus area image'), upload_to=image_path, help_text=_('The image that will appear on the focus area project ' 'listing page.'), ) link_to = models.URLField( _('accordion link'), max_length=200, blank=True, help_text=_( _('Where the link in the accordion for the focus area points if other than the ' 'focus area project listing.'))) @models.permalink def get_absolute_url(self): return ('project-directory', ()) def projects(self): 'return all projects that "belong" to the FA through the Categories it links to' Project = apps.get_model('rsr', 'Project') return Project.objects.filter(categories__in=self.categories.all()) def __str__(self): return self.name class Meta: app_label = 'rsr' verbose_name = _('focus area') verbose_name_plural = _('focus areas') ordering = [ 'name', ]
class Gallery(BaseCatalogModel): image = ImageField(upload_to='Gallery') def categories_count(self): return str(self.categories.count()) categories_count.short_description = _('Categories') class Meta: verbose_name = _('Gallery') verbose_name_plural = _('Galleries') ordering = ['name']
class CatalogPage(models.Model): catalog = models.ForeignKey(Catalog, related_name='pages', verbose_name=_('Catalog')) page_number = models.PositiveIntegerField(verbose_name=_('Page Number')) image = ImageField(upload_to='Catalogs/Pages', verbose_name=_('Image')) class Meta: verbose_name = _('Catalog Page') verbose_name_plural = _('Catalog Pages') ordering = ['page_number'] def __str__(self): return self.catalog.name
class Species(models.Model, UrlNameMixin): objects = SpeciesManager() species_id = models.AutoField(primary_key=True) genus = models.ForeignKey(Genus) origin = models.ForeignKey(Location, blank=True, null=True) latin_name = models.CharField(max_length=30) name = models.CharField(max_length=30) can_scale_with_pruning = models.BooleanField(default=False) years_till_full_size = IntegerRangeField(min_value=1, max_value=100, blank=True, null=True) full_size_height = IntegerRangeField(min_value=1, max_value=500, blank=True, null=True) full_size_width = IntegerRangeField(min_value=1, max_value=200, blank=True, null=True) years_till_first_production = IntegerRangeField(min_value=1, max_value=30, blank=True, null=True) years_till_full_production = IntegerRangeField(min_value=1, max_value=100, blank=True, null=True) featured_image = ImageField(upload_to='featured-images', blank=True, null=True) google_maps_image_url = models.CharField(max_length=100, blank=True, null=True, default=None) generated_name = models.CharField(max_length=60, unique=True, blank=True, null=True) class Meta: ordering = ('generated_name', ) unique_together = (('genus', 'latin_name')) def save(self, *args, **kwargs): self.generated_name = self.__get_generated_name() return super(Species, self).save(*args, **kwargs) def __str__(self): return self.generated_name or self.__get_generated_name() def __get_generated_name(self): return '{0} ({1})'.format(self.name, self.latin_name)
class Slider(defModel): img = ImageField(verbose_name='изображение слайдера', upload_to='slider_images') text = models.TextField(verbose_name='Текст', null=False, blank=True) img_crop = ImageRatioField('img', "800x300", verbose_name='Обрезка изображения') class Meta: verbose_name = "Слайдер" verbose_name_plural = "Слайдер"
class ExtendedFlatPage(FlatPage, BaseSeoModel): MENU_CHOICES = ( (1, 'Product Information'), (2, 'News/Press'), (3, 'About Us'), ) url_es = models.CharField(_('URL_ES'), max_length=100, db_index=True, null=True, blank=True) title_es = models.CharField(max_length=200, blank=True, null=True) content_es = models.TextField(blank=True, null=True) menu_title = models.CharField(max_length=200, default='') menu_title_es = models.CharField(max_length=200, default='', blank=True) order = models.PositiveIntegerField( verbose_name=_('Order'), help_text= 'El orden en el que aparecera en el menu selecciondado despues de los elementos predefinidos' ) menu = models.IntegerField(choices=MENU_CHOICES, default=1) cover = ImageField(null=True, blank=True, verbose_name=_('Cover')) objects = models.Manager() class Meta: verbose_name = _('flat page') verbose_name_plural = _('flat pages') ordering = ('order', ) def get_title(self, language): if language == 'es' and self.title_es is not None and self.title_es: return self.title_es return self.title def get_menu(self, language): if language == 'es' and self.menu_title_es is not None and self.menu_title_es: return self.menu_title_es return self.menu_title def get_content(self, language): if language == 'es' and self.content_es is not None and self.content_es: return self.content_es return self.content def get_url(self, language): if language == 'es' and self.url_es is not None and self.url_es: return '/es' + self.url_es return '/en' + self.url def __str__(self): return self.title
class EventImage(ThumbMixin, TimestampedModel): """ Images For Events """ latitude = models.FloatField(default=0.00, db_index=True) longitude = models.FloatField(default=0.00, db_index=True) image = ImageField(upload_to='event_images/') caption = models.CharField(max_length=100, blank=True) def __unicode__(self): return self.image.name @property def url(self): return self.image.url
class Photo(models.Model): photo = ImageField(_('image'), upload_to='catalog') ordering = models.IntegerField(_('ordering'), default=100) def __str__(self): return self.photo.url def get_thumbnail(self, size='150x150'): return get_thumbnail(self.photo, size, crop='center', quality=81) class Meta: abstract = True ordering = ['ordering', 'id'] verbose_name = _('photo') verbose_name_plural = _('photos')
class SuperBanner(models.Model): image = ImageField(_('image'), upload_to='superbanner') title = models.CharField(_('title'), max_length=64, null=True, blank=True) text = RichTextField(_('text'), blank=True) button_link = models.CharField(_('button link'), max_length=256, null=True, blank=True) button_label = models.CharField(_('button label'), max_length=32, null=True, blank=True) ordering = models.IntegerField(_('ordering'), default=100) def __str__(self): return self.title or self.image.url class Meta: ordering = ['ordering'] verbose_name = _('superbanner') verbose_name_plural = _('superbanners')
class CollectionContent(FlatPage, BaseSeoModel): url_es = models.CharField(_('URL_ES'), max_length=100, db_index=True, null=True, blank=True) title_es = models.CharField(max_length=200, blank=True, null=True) content_es = models.TextField(blank=True, null=True) menu_title = models.CharField(max_length=200, default='') menu_title_es = models.CharField(max_length=200, default='', blank=True) order = models.PositiveIntegerField( verbose_name=_('Order'), help_text= 'El orden en el que aparecera en el menu selecciondado despues de los elementos predefinidos' ) cover = ImageField(null=True, blank=True, verbose_name=_('Cover')) collection = models.ForeignKey(Collection, related_name='content', verbose_name='collection') objects = models.Manager() class Meta: verbose_name = _('Collection content') verbose_name_plural = _('Collection content') ordering = ('order', ) def get_title(self, language): if language == 'es' and self.title_es is not None and self.title_es: return self.title_es return self.title def get_menu(self, language): if language == 'es' and self.menu_title_es is not None and self.menu_title_es: return self.menu_title_es return self.menu_title def get_content(self, language): if language == 'es' and self.content_es is not None and self.content_es: return self.content_es return self.content def get_url(self, language): if language == 'es' and self.url_es is not None and self.url_es: return self.url_es return self.url def __str__(self): return self.title
class EventReport(models.Model): event_report_id = models.AutoField(primary_key=True) submitted_by = models.ForeignKey(User) datetime = models.DateTimeField(default=timezone.now) fruiting_plant = models.ForeignKey(FruitingPlant) was_auto_generated = models.BooleanField(default=False) event_type = models.ForeignKey(EventType) affinity = models.IntegerField(choices=AFFINITY_CHOICES, default=AFFINITY_NEUTRAL) notes = models.TextField(blank=True, null=True) image = ImageField(upload_to=upload_image, blank=True, null=True) def __str__(self): value = '{0} - {1} - {2}'.format(self.datetime, self.event_type, str(self.fruiting_plant)) return value
class Blog(defModel): img = ImageField(verbose_name='изображение', upload_to='blogs') img_crop_thumbnail = ImageRatioField('img', '310x280', verbose_name='Обрезка миниатюры') title = models.CharField(max_length=255, verbose_name='Заголовок новости', blank=True) text = models.TextField(verbose_name='Текст новости') def img_admin(self): return format_html("<a href ='%s/change/'><img src='%s' ></a>" % (self.id, get_thumbnail(self.img, 'x100').url)) class Meta: verbose_name = "Новость" verbose_name_plural = "Новости"
class Person(models.Model): first_name = models.CharField(max_length=60) last_name = models.CharField(max_length=60) birth_date = models.DateField() bio = models.TextField() email = models.EmailField(max_length=75) skype = models.CharField(max_length=40) jabber = models.CharField(max_length=75) other_contacts = models.TextField() photo = ImageField(upload_to='images/uploads', null=True, blank=True) def _get_full_name(self): return '%s %s' % (self.first_name, self.last_name) full_name = property(_get_full_name) def __unicode__(self): return u"%s %s" % (self.last_name, self.first_name)
class Image(OrderedModel): product = models.ForeignKey( Product, verbose_name=_('product'), related_name='images', on_delete=models.CASCADE, ) image = ImageField( _('image'), upload_to='product_images', ) order_with_respect_to = 'product' class Meta: verbose_name = _('image') verbose_name_plural = _('images') def __str__(self): return self.image.name.split(os.path.sep)[-1]
class Photo(models.Model): album = models.ForeignKey( to=Album, on_delete=models.CASCADE, verbose_name='앨범', related_name='photos', ) tagged_children = models.ManyToManyField( to=Child, verbose_name='학생', related_name='photos', blank=True, ) image = ImageField( verbose_name='사진 경로', upload_to='photos', ) class Meta: verbose_name = '사진' verbose_name_plural = '사진'
class Gallery(defModel): img = ImageField(verbose_name='изображение галереи', upload_to='gallery') img_crop = ImageRatioField('img', '1200x600', verbose_name='Обрезка оригинала') img_crop_thumbnail = ImageRatioField('img', '206x140', verbose_name='Обрезка миниатюры') text = models.TextField(verbose_name='Ифнормация', blank=True) title = models.CharField(max_length=255, verbose_name="Заголовок", blank=True) prior = models.IntegerField(verbose_name='приоритет порядка отображения', default=0) def img_admin(self): return format_html("<a href ='%s/change/'><img src='%s' ></a>" % (self.id, get_thumbnail(self.img, 'x80').url)) class Meta: verbose_name = "Фото" verbose_name_plural = "Фотографии"
class UserProfile(AuditableModel): GENDER_CHOICES = Enumeration([(1, 'MALE', strings.GENDER_MALE), (2, 'FEMALE', strings.GENDER_FEMALE), (3, 'UNDISCLOSED', strings.GENDER_UNDISCLOSED)]) user = models.OneToOneField( User, verbose_name=strings.USER_PROFILE_USER, ) gender = models.PositiveIntegerField( verbose_name=strings.USER_PROFILE_GENDER, choices=GENDER_CHOICES, default=3, ) hometown = models.CharField( verbose_name=strings.USER_PROFILE_HOMETOWN, max_length=75, blank=True, default=u'Lima, Perú', ) language = models.PositiveIntegerField( verbose_name=strings.USER_PROFILE_LANGUAGE, choices=constants.LANGUAGE_CHOICES, default=1) invitations_left = models.PositiveIntegerField( verbose_name=strings.USER_PROFILE_INVITATIONS_LEFT, default=settings.CLOSED_BETA_DEFAULT_ADDITIONAL_INVITATIONS) # a User can have circuits as favorites favorites = models.ManyToManyField( Circuit, related_name='follower_profiles', ) bio = models.TextField( verbose_name=strings.USER_PROFILE_BIO, blank=True, ) picture = ImageField( verbose_name=strings.USER_PROFILE_AVATAR, upload_to=uuid_based_picture_name('pictures/users'), blank=True, null=True, ) # Organization data is_organization = models.BooleanField( verbose_name=strings.USER_PROFILE_IS_ORGANIZATION, default=False) def __unicode__(self): return u'%s' % (self.user.get_full_name(), ) class Meta: verbose_name = strings.USER_PROFILE_VERBOSE_NAME verbose_name_plural = strings.USER_PROFILE_VERBOSE_NAME_PLURAL @staticmethod def get_or_create(email, first, last, fb_id): """logs a user if email dont exists, or creates a user logs in if email is in use""" from common.utils.verbose_password_generator import pass_generator # email exists is our database if User.objects.filter(email=email).exists(): user = User.objects.get(email=email) # email is new to our database so create a user and login else: psw = pass_generator() user = UserProfile.create_user_with_tokens(first=first, last=last, email=email, password=psw) fb_profile = UserFacebook( user=user, name=first + ' ' + last, facebook_graphid=fb_id, ) fb_profile.save() return user @staticmethod def create_user_with_tokens(first, last, email, password, username=None, facebook_oauth_token=None, facebook_graphid=None, twitter_oauth_token=None, twitter_oauth_secret=None): """ method for creating a user, bind to userprofile and bind to twitter and facebook profiles if needed """ from django.core.mail import EmailMultiAlternatives #Check that email is not already in use if User.objects.filter(email=email).exists(): return None # create a hash from email in order to be used as username username = str(hashlib.sha1(email).hexdigest()) username = NumConv(16).str2int(username) username = NumConv(64).int2str(username) # create a new User new_user = User.objects.create_user(username, email, password) new_user.first_name = (first) new_user.last_name = (last) new_user.save() # bind new_user to a UserProfile new_profile = UserProfile(user=new_user) new_profile.save() # bind to Twitter account if comes if twitter_oauth_token is not None: tw = UserTwitter( user=new_user, oauth_token_key=twitter_oauth_token, oauth_token_secret=twitter_oauth_secret, screen_name=username, ) tw.save() # bind to facebook if comes if facebook_oauth_token is not None: fb = UserFacebook(user=new_user, facebook_access_token=facebook_oauth_token, facebook_graphid=facebook_graphid) fb.save() #send an email to user with its password, and indications # to change it and that he can continue to log in with # facebook # mandatory fields subject = strings.EMAIL_ACCOUNT_CREATED_FB_SUBJECT to = new_user.email from_email = settings.DEFAULT_FROM_EMAIL # get text version of the message text_content = strings.EMAIL_ACCOUNT_CREATED_FB_CONTENT % { 'username': new_user.email, 'password': password } # FIXME: HTML version implementation pending # html_content = self.get_email_content_from_type( # self.notification_type # ) msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) #msg.attach_alternative(html_content, "text/html") msg.send() return new_user def save_image_from_url(self, url): """Store image locally from url""" import urllib import os from django.core.files import File result = urllib.urlretrieve(url) self.picture.save(os.path.basename(url), File(open(result[0]))) self.save() def is_following(self, user): if UserFollower.objects.filter(owner=user).filter( follower=self.user).count() > 0: return True else: return False def is_follower(self, user): if UserFollower.objects.filter(owner=self.user).filter( follower=user).count() > 0: return True else: return False def follow(self, user): if self.user == user: return False if self.is_following(user): return False else: record = UserFollower(owner=user, follower=self.user) record.save() return True def unfollow(self, user): if self.user == user: return False try: record = UserFollower.objects.get(owner=user, follower=self.user) record.delete() return True except UserFollower.DoesNotExist: return False def add_follower(self, user): if self.user == user: return False if self.is_follower(user): return False else: record = UserFollower(owner=self.user, follower=user) record.save() return True def remove_follower(self, user): if self.user == user: return False try: record = UserFollower.objects.get(owner=self.user, follower=user) record.delete() return True except UserFollower.DoesNotExist: return False def get_followers(self): if hasattr(self.user, 'follower_records_as_owner'): records = self.user.follower_records_as_owner.all() user_id_list = [record.follower.id for record in records] return User.objects.filter( id__in=user_id_list).order_by('username') else: return User.objects.none() def get_followed_users(self): if hasattr(self.user, 'follower_records_as_follower'): records = self.user.follower_records_as_follower.all() user_id_list = [record.owner.id for record in records] return User.objects.filter( id__in=user_id_list).order_by('username') else: return User.objects.none() def get_restful_link_metadata(self, rel='alternate'): metadata = OrderedDict() metadata['href'] = self.get_restful_url() metadata['rel'] = rel metadata['title'] = self.user.get_full_name() metadata['type'] = 'application/json' return metadata def get_restful_url(self): return "%s%s" % (settings.API_V1_PREFIX.rstrip('/'), reverse('user_resource', kwargs={'user_id': self.user.pk}))