#########################################################################################
# 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