######################################################################################### # mysite/general/admin.py ######################################################################################### from django.contrib import admin from django import forms from mysite.general.models import Link, LinkCategory class XFNForm(forms.ModelForm): error = { 'me': u'You cannot have a relationship with yourself. ', 'fr': u'You can only be one type of friend. ', 'geo': u'You can only have one geographical relationship. ', 'fa': u'I certainly hope you are only related in one way... ', } def clean_rel(self): error = str(); out = str() rel_types = { 'fr': ('contact','acquaintance','friend'), 'met': ('met',), 'pro': ('co-worker','colleague'), 'geo': ('co-resident', 'neighbor'), 'fa': ('child','parent','sibling','spouse','kin'), 'ro': ('muse','crush','date','sweetheart') } rel_limit = {'fr': 1,'met': 1,'geo': 1,'fa': 1} data = str(self.cleaned_data['rel']).lower() relations = rel_types.keys() """ Highlight Duplicates """ for type in relations: for manner in rel_types[type]: if data.count(manner) >= 2: error += 'You have duplicate entries for '+str(manner)+'. ' else: if data.count(manner): out += manner+' ' if type in rel_limit: rel_limit[type] -= 1 if rel_limit[type] < 0: error += self.error[type] if out.count('me') and out.count('met') == 0 and len(out.strip(' ')) >= 3: error += self.error['me'] if error: raise forms.ValidationError(error) else: return out[:-1] class LinkAdmin(admin.ModelAdmin): form = XFNForm list_display = ('name','category') fieldsets = ( ('Link', { 'fields': ('name','url'), }), ('Display Method', { 'fields': ('category','display_type'), }), ('XFN', { 'fields': ('rel',), }), ) radio_fields = {'category': admin.HORIZONTAL, 'display_type': admin.HORIZONTAL} class Media: js = ("/src/admin/js/xfn-admin.js",) # Making the Category a radio field seems strange, so you don't have to do it; it's a personal preference. class LinkCategoryAdmin(admin.ModelAdmin): list_display = ('display_name',) admin.site.register(Link, LinkAdmin) ######################################################################################### # mysite/general/models.py ######################################################################################### from django.db import models LINK_DISPLAY = ( ('blog_roll', 'Blog Roll'), ('bot_links', 'Bottom Link List'), # Add whatever you want here or even make another LinkCategory type thing :) # These are taken straight from my layout so I can pull them by tag. ) class LinkCategory(models.Model): display_name = models.CharField(max_length=125) def __unicode__(self): return self.display_name class Meta: verbose_name = "Link Category" verbose_name_plural = "Link Categories" class Link(models.Model): name = models.CharField(max_length=100) url = models.URLField(verify_exists=True, max_length=500) rel = models.CharField("XFN Relation", max_length=82, blank=True, null=True) category = models.ForeignKey(LinkCategory) display_type = models.CharField(max_length=50, choices=LINK_DISPLAY, default=None, blank=True, null=True) def __unicode__(self): return self.name