<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>limestone/editorsdesk/__init__.py</filename>
    </added>
    <added>
      <filename>limestone/editorsdesk/models.py</filename>
    </added>
    <added>
      <filename>limestone/editorsdesk/templatetags/__init__.py</filename>
    </added>
    <added>
      <filename>limestone/editorsdesk/templatetags/smart_if.py</filename>
    </added>
    <added>
      <filename>limestone/editorsdesk/urls.py</filename>
    </added>
    <added>
      <filename>limestone/editorsdesk/views.py</filename>
    </added>
    <added>
      <filename>limestone/media/templates/n21alpha/images/photo.png</filename>
    </added>
    <added>
      <filename>limestone/partner/templatetags/__init__.html</filename>
    </added>
    <added>
      <filename>limestone/partner/templatetags/smart_if.py</filename>
    </added>
    <added>
      <filename>limestone/plaintext/admin.py</filename>
    </added>
    <added>
      <filename>limestone/templates/n21alpha/admin/base_site.html</filename>
    </added>
    <added>
      <filename>limestone/templates/n21alpha/editorsdesk/base.html</filename>
    </added>
    <added>
      <filename>limestone/templates/n21alpha/editorsdesk/dashboard.html</filename>
    </added>
    <added>
      <filename>limestone/templates/n21alpha/partner/base.html</filename>
    </added>
    <added>
      <filename>limestone/templates/n21alpha/partner/dashboard.html</filename>
    </added>
    <added>
      <filename>limestone/utils/EXIF.py</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -6,3 +6,5 @@ eggs/*
 parts/*
 .installed.cfg
 .DS_Store
+limestone/media/ik_cache/*
+limestone/media/uploads/*</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -33,6 +33,11 @@ since the migrations (south) are included in code just make sure db config is co
   bin/django syncdb
   bin/django migrate
 
+photologue is used for image processing
+... configure the default settings (don't worry you can change them in the admin if you mess up)
+
+  bin/django plinit
+
 that should be it, 
 ... runserver and test it
 </diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -15,6 +15,7 @@ from limestone.main.models import Profile, ProfileForm
 from limestone.newsroom.models import Newsroom
 from limestone.partner.models import Partner, PartnerForm
 from limestone.story.models import MetaStory
+from limestone.multimedia.models import Media
 
 def home(request):
     return render_to_response(&quot;main/home.html&quot;, {}, context_instance=RequestContext(request))
@@ -27,14 +28,22 @@ def terms(request):
 
 @login_required
 def dashboard(request):
-    # check to see if user is associated with newsroom or partner ...
+    # first if the user is an editor if so send them to editor's desk
+    if request.user.is_staff:
+        return HttpResponseRedirect(reverse('editorsdesk_dashboard'))
+        
+    # check to see if user is associated with newsroom or partner ... if neither ... send to association page
     n_count = Newsroom.objects.filter(members=request.user).distinct().count()
     p_count = Partner.objects.filter(members=request.user).distinct().count()
-    if n_count == 0 &amp; p_count == 0:
+    if n_count == 0 and p_count == 0:
         return HttpResponseRedirect(reverse('user_association'))
     
+    # if user is part of a partner ... send to seperate dashboard
+    if p_count &gt; 0:
+        return HttpResponseRedirect(reverse('partner_dashboard'))
+        
     stories = MetaStory.objects.filter(created_by=request.user)
-    entries = MetaStory.objects.filter(created_by=request.user)
+    entries = Media.children.filter(authors=request.user)
 
     return render_to_response(&quot;main/dashboard.html&quot;, {'stories':stories,'entries':entries}, context_instance=RequestContext(request))
  </diff>
      <filename>limestone/main/views.py</filename>
    </modified>
    <modified>
      <diff>@@ -75,9 +75,9 @@ a:hover{color:#6F6F6F;text-decoration:underline}
 .icon-package {float: left;padding-right:5px;margin:0px 0px 0px 5px;background:url('../images/page_white_stack.png') no-repeat;display:block;width:16px;height:16px;}
 .icon-story {float: left;padding-right:5px;margin:0px 0px 0px 5px;background:url('../images/page_white.png') no-repeat;display:block;width:16px;height:16px;}
 .icon-plaintext {float: left;padding-right:5px;margin:0px 0px 0px 5px;background:url('../images/page_white_text.png') no-repeat;display:block;width:16px;height:16px;}
+.icon-photo {float: left;padding-right:5px;margin:0px 0px 0px 5px;background:url('../images/photo.png') no-repeat;display:block;width:16px;height:16px;}
 
-
-.sidebar-right-listing { height:18px; padding-top: 4px; padding-left:5px; }
+.sidebar-right-listing { padding-top: 4px; padding-left:5px; }
 
     
 .alternating-row-event {  }</diff>
      <filename>limestone/media/templates/n21alpha/css/layout.css</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,7 @@
 from django.db import models
 import django.contrib.auth.models as auth
+from django.template.defaultfilters import slugify
+from datetime import datetime
 
 from tagging.fields import TagField
 from tagging.models import Tag
@@ -36,6 +38,14 @@ class Media(ParentModel):
     def __str__(self):
         return self.title
 
+    def save(self):
+        if self.slug is None:
+            self.slug = slugify(self.headline)
+        if self.created_at == None:
+            self.created_at = datetime.now()
+        self.updated_at = datetime.now()
+        super(Media, self).save()
+
     def _set_tags(self, tags):
 	    Tag.objects.update_tags(self, tags)
 </diff>
      <filename>limestone/multimedia/models.py</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 from django.db import models
 import django.contrib.auth.models as auth
 from django.forms import ModelForm
-
+from datetime import datetime
 
 class Partner(models.Model):
     name = models.CharField(max_length=150,verbose_name=&quot;Media Outlet Name&quot;)
@@ -13,7 +13,19 @@ class Partner(models.Model):
     created_at = models.DateTimeField(editable=False)
     updated_by = models.ForeignKey(auth.User, related_name=&quot;partner_updated_by&quot;)
     updated_at = models.DateTimeField(editable=False)
+    
+    def __unicode__(self):
+        return unicode(self.name)
+
+    def __str__(self):
+        return self.name
 
+    def save(self):
+        if self.created_at == None:
+            self.created_at = datetime.now()
+        self.updated_at = datetime.now()
+        super(Partner, self).save()
+        
 class PartnerForm(ModelForm):
     class Meta:
         model = Partner</diff>
      <filename>limestone/partner/models.py</filename>
    </modified>
    <modified>
      <diff>@@ -4,5 +4,6 @@ from django.conf.urls.defaults import *
 urlpatterns = patterns ('',
 
     url(r'member/add/$','limestone.partner.views.create_partner_member',name='partner_create_member',),
-
+    url(r'dashboard/$','limestone.partner.views.dashboard',name='partner_dashboard',),
+    
 )</diff>
      <filename>limestone/partner/urls.py</filename>
    </modified>
    <modified>
      <diff>@@ -16,4 +16,27 @@ from limestone.partner.models import Partner, PartnerForm
 
 @login_required
 def create_partner_member(request):
-    return render_to_response(&quot;main/terms.html&quot;, {}, context_instance=RequestContext(request))
\ No newline at end of file
+    if request.method == 'POST':
+        partner = Partner(created_by = request.user, updated_by = request.user)
+        
+        form = PartnerForm(request.POST,instance=partner)
+        
+        if form.is_valid():
+            form.save()
+            
+            partner.members.add(request.user)
+            
+            request.user.message_set.create(message=&quot;1|Your partner info was saved successfully.&quot;)
+            
+            return HttpResponseRedirect( reverse('partner_dashboard') )
+        else:
+            request.user.message_set.create(message=&quot;0|An error has occured.&quot;)
+            newsrooms = Newsroom.objects.all()
+            
+            return render_to_response( &quot;main/association.html&quot;, {'newsrooms':newsrooms,'form':form}, context_instance=RequestContext(request))
+    else:
+        return HttpResponseRedirect( settings.LOGIN_REDIRECT_URL )
+
+@login_required
+def dashboard(request):
+    return render_to_response( &quot;partner/dashboard.html&quot;, {}, context_instance=RequestContext(request))
\ No newline at end of file</diff>
      <filename>limestone/partner/views.py</filename>
    </modified>
    <modified>
      <diff>@@ -11,8 +11,6 @@ class Migration:
         db.create_table('photos_photo', (
             ('media_ptr', models.OneToOneField(orm['multimedia.Media'])),
             ('image', models.ForeignKey(orm.Image)),
-            ('created_by', models.ForeignKey(orm['auth.User'], related_name=&quot;photos_created&quot;)),
-            ('modified_by', models.ForeignKey(orm['auth.User'], related_name=&quot;photos_modified&quot;)),
         ))
         db.send_create_signal('photos', ['Photo'])
         
@@ -86,10 +84,8 @@ class Migration:
         },
         'photos.photo': {
             'Meta': {'_bases': ['limestone.multimedia.models.Media']},
-            'created_by': ('models.ForeignKey', [&quot;orm['auth.User']&quot;], {'related_name': '&quot;photos_created&quot;'}),
             'image': ('models.ForeignKey', [&quot;orm['photos.Image']&quot;], {}),
-            'media_ptr': ('models.OneToOneField', [&quot;orm['multimedia.Media']&quot;], {}),
-            'modified_by': ('models.ForeignKey', [&quot;orm['auth.User']&quot;], {'related_name': '&quot;photos_modified&quot;'})
+            'media_ptr': ('models.OneToOneField', [&quot;orm['multimedia.Media']&quot;], {})
         },
         'multimedia.media': {
             '_stub': True,</diff>
      <filename>limestone/photos/migrations/0001_initial.py</filename>
    </modified>
    <modified>
      <diff>@@ -17,6 +17,7 @@ from imagekit.models import ImageModel
 from imagekit.lib import Image
 
 from limestone.multimedia.models import Media, MediaManager
+from limestone.utils import EXIF
 
 # Modify image file buffer size.
 PHOTOS_IMAGEKIT_SPEC = getattr(settings, 'PHOTOS_IMAGEKIT_SPEC', 'limestone.photos.ik_specs')
@@ -155,8 +156,16 @@ class Image(ImageModel):
     view_count = models.PositiveIntegerField(default=0, editable=False)
     created = models.DateTimeField(auto_now_add=True)
     modified = models.DateTimeField(auto_now=True)
-
-
+    
+    def EXIF(self):
+        #try:
+        return EXIF.process_file(open(self.image.path, 'rb'))
+        #except:
+        #    try:
+        #        return EXIF.process_file(open(self.image.path, 'rb'), details=False)
+        #    except:
+        #        return {}
+    
     def __unicode__(self):
         return self.image.name
 
@@ -173,7 +182,7 @@ class Photo(Media):
 
     image = models.ForeignKey(Image)
     objects = PhotoManager()
-
+    
     def get_previous_in_gallery(self, gallery):
         try:
             return self.get_previous_by_date_added(
@@ -194,6 +203,9 @@ class Photo(Media):
     def get_thumbnail_width(self):
         return self.image.mediumthumb.get_width()
 
+    def get_thumbnail_height(self):
+        return self.image.mediumthumb.get_height()
+
     def get_original_url(self):
         return self.image.image.url
 
@@ -205,3 +217,6 @@ class Photo(Media):
 
     def get_height(self):
         return self.image.image.height
+
+    def get_info(self):
+        return self.image.EXIF()
\ No newline at end of file</diff>
      <filename>limestone/photos/models.py</filename>
    </modified>
    <modified>
      <diff>@@ -4,8 +4,8 @@ from django.conf.urls.defaults import *
 urlpatterns = patterns ('limestone.photos.views',
 
     url(r'^$','new_photo',name='photo_new'),
-    #url(r'^create/$','save_photo',name='photo_create'),
-    #url(r'^(?P&lt;multimedia_id&gt;\d+)/$','edit_photo',name='photo_edit'),
-    #url(r'^(?P&lt;multimedia_id&gt;\d+)/update/$','save_photo',name='photo_update'),
+    url(r'^create/$','save_photo',name='photo_create'),
+    url(r'^(?P&lt;multimedia_id&gt;\d+)/$','edit_photo',name='photo_edit'),
+    url(r'^(?P&lt;multimedia_id&gt;\d+)/update/$','save_photo',name='photo_update'),
 
 )
\ No newline at end of file</diff>
      <filename>limestone/photos/urls.py</filename>
    </modified>
    <modified>
      <diff>@@ -16,11 +16,12 @@ from limestone.photos.models import Photo
 
 @login_required
 def new_photo(request,metastory_id,story_id):
+
     metastory = get_object_or_404(MetaStory, pk=metastory_id)
     story = get_object_or_404(Story, pk=story_id, metastory=metastory)
     form = PhotoForm()
     upload_form = ImageForm()
-
+    
     inherited_tags = []
     inherited_tag_ids = []
     for newsroom in metastory.newsrooms.all():
@@ -37,7 +38,37 @@ def new_photo(request,metastory_id,story_id):
 
     members = auth.User.objects.filter(newsroom_members__metastory_newsrooms__newsrooms__id__in=metastory.newsrooms.values_list('id',flat=True)).distinct()
     breadcrumb = [ {'title':metastory,'url':reverse('metastory_edit', args=[metastory_id])} , {'title':story,'url':reverse('story_edit', args=[metastory_id,story_id])} , {'title':'New Photo','url':reverse('photo_new', args=[metastory_id,story_id])} ]
-    return render_to_response(&quot;multimedia/photo.html&quot;, {'breadcrumb':breadcrumb,'form':form,'upload_form':upload_form,'inherited_tags':inherited_tags,'tags':tags,'newsrooms_members':members,'form_url':reverse('plaintext_create', args=[metastory_id,story_id])}, context_instance=RequestContext(request))
+    return render_to_response(&quot;multimedia/photo.html&quot;, {'breadcrumb':breadcrumb,'form':form,'image':'','upload_form':upload_form,'inherited_tags':inherited_tags,'tags':tags,'newsrooms_members':members,'form_url':'','upload_form_url':reverse('photo_create', args=[metastory_id,story_id])}, context_instance=RequestContext(request))
+
+
+@login_required
+def edit_photo(request,metastory_id,story_id,multimedia_id):
+
+    metastory = get_object_or_404(MetaStory, pk=metastory_id)
+    story = get_object_or_404(Story, pk=story_id, metastory=metastory)
+    multimedia = get_object_or_404(Photo, pk=multimedia_id, story=story)
+    form = PhotoForm(instance=multimedia)
+    upload_form = ImageForm()
+    authors = multimedia.authors.all()
+    
+    inherited_tags = []
+    inherited_tag_ids = []
+    for newsroom in metastory.newsrooms.all():
+        for tag in newsroom.get_tags():
+            inherited_tags.append(tag)
+            inherited_tag_ids.append(tag.id)
+    for mtag in metastory._get_tags():
+        inherited_tags.append(mtag)
+        inherited_tag_ids.append(mtag.id)
+    for stag in story._get_tags():
+        inherited_tags.append(stag)
+        inherited_tag_ids.append(stag.id)
+    tags = Tag.objects.exclude(id__in=inherited_tag_ids)
+    used_tags = multimedia._get_tags()
+
+    members = auth.User.objects.filter(newsroom_members__metastory_newsrooms__newsrooms__id__in=metastory.newsrooms.values_list('id',flat=True)).distinct()
+    breadcrumb = [ {'title':metastory,'url':reverse('metastory_edit', args=[metastory_id])} , {'title':story,'url':reverse('story_edit', args=[metastory_id,story_id])} , {'title':multimedia,'url':reverse('photo_edit', args=[metastory_id,story_id,multimedia.id])} ]
+    return render_to_response(&quot;multimedia/photo.html&quot;, {'breadcrumb':breadcrumb,'form':form,'image':multimedia,'authors':authors,'upload_form':upload_form,'inherited_tags':inherited_tags,'tags':tags,'used_tags':used_tags,'newsrooms_members':members,'form_url':reverse('photo_update', args=[metastory_id,story_id,multimedia.id]),'upload_form_url':''}, context_instance=RequestContext(request))
 
 
 @login_required
@@ -45,42 +76,64 @@ def save_photo(request,metastory_id,story_id,multimedia_id=None):
     if request.method == 'POST':
         metastory= get_object_or_404(MetaStory, pk=metastory_id)
         story = get_object_or_404(Story, pk=story_id, metastory=metastory)
-        if multimedia_id:
-            multimedia = get_object_or_404(PlainText, pk=multimedia_id, story=story)
-        else:
-            multimedia = Photo(created_by = request.user, story=story, created_at = datetime.now())
 
-        multimedia.updated_by = request.user
-        multimedia.updated_at = datetime.now()
-        form = PhotoForm(request.POST,instance=multimedia)
-        upload_form = ImageForm(request.POST,instance=multimedia.image)
-        
-        upload_valid = true
+        form = PhotoForm()
+        upload_form = ImageForm(request.POST, request.FILES)
+        upload_valid = True
         if not multimedia_id:
             if upload_form.is_valid():
-                image = upload_form.save(commit=False)
-                image.save()
+                multimedia = Photo(created_by = request.user, story=story, created_at = datetime.now())
+                image = upload_form.save()
+                
+                multimedia.updated_by = request.user
+                multimedia.updated_at = datetime.now()
+                multimedia.title = image.EXIF().get('Image DocumentName',image.image.name)
+                multimedia.summary = image.EXIF().get('Image ImageDescription',image.image.name)
+                multimedia.image = image
+                multimedia.save()
+                
+                form = PhotoForm(instance=multimedia)
             else:
-                request.user.message_set.create(message=&quot;0|An file is required for upload.&quot;)
-                upload_valid = false
+                request.user.message_set.create(message=&quot;0|A file is required for upload.&quot;)
+                return HttpResponseRedirect( reverse('photo_edit', args=[metastory_id,story_id,multimedia.id]) )
+        else:    
+            multimedia = get_object_or_404(Photo, pk=multimedia_id, story=story)
+            image_url = multimedia.image.image.name
+            multimedia.updated_by = request.user
+            multimedia.updated_at = datetime.now()
+            multimedia.authors = request.POST.getlist('authors')
+            form = PhotoForm(request.POST,instance=multimedia)
 
-        if form.is_valid() and upload_valid:
-            form.image = image
-            form.save()
-            request.user.message_set.create(message=&quot;1|Your photo asset was saved successfully.&quot;)
+            if form.is_valid():
+                form.save()
+                request.user.message_set.create(message=&quot;1|Your photo asset was saved successfully.&quot;)
 
-            stags = ''
-            for tag in Tag.objects.all():
-                if request.POST.__contains__('tag_%d' % tag.id):
-                    stags += ' '+tag.name
-            multimedia._set_tags(stags)
-
-            return HttpResponseRedirect( reverse('photo_edit', args=[metastory_id,story_id,multimedia.id]) )
-        else:
-            if upload_valid:
+                stags = ''
+                for tag in Tag.objects.all():
+                    if request.POST.__contains__('tag_%d' % tag.id):
+                        stags += ' '+tag.name
+                multimedia._set_tags(stags)
+            else:
                 request.user.message_set.create(message=&quot;0|An error has occured.&quot;)
+        
+        authors = multimedia.authors.all()
+        inherited_tags = []
+        inherited_tag_ids = []
+        for newsroom in metastory.newsrooms.all():
+            for tag in newsroom.get_tags():
+                inherited_tags.append(tag)
+                inherited_tag_ids.append(tag.id)
+        for mtag in metastory._get_tags():
+            inherited_tags.append(mtag)
+            inherited_tag_ids.append(mtag.id)
+        for stag in story._get_tags():
+            inherited_tags.append(stag)
+            inherited_tag_ids.append(stag.id)
+        tags = Tag.objects.exclude(id__in=inherited_tag_ids)    
+        used_tags = multimedia._get_tags()
 
-            tags = Tag.objects.all()
-            return render_to_response( &quot;multimedia/photo.html&quot;, {'form':form,'tags':tags}, context_instance=RequestContext(request))
+        members = auth.User.objects.filter(newsroom_members__metastory_newsrooms__newsrooms__id__in=metastory.newsrooms.values_list('id',flat=True)).distinct()
+        breadcrumb = [ {'title':metastory,'url':reverse('metastory_edit', args=[metastory_id])} , {'title':story,'url':reverse('story_edit', args=[metastory_id,story_id])} , {'title':multimedia,'url':reverse('photo_edit', args=[metastory_id,story_id,multimedia.id])} ]
+        return render_to_response(&quot;multimedia/photo.html&quot;, {'breadcrumb':breadcrumb,'form':form,'image':multimedia,'upload_form':upload_form,'authors':authors,'inherited_tags':inherited_tags,'tags':tags,'used_tags':used_tags,'newsrooms_members':members,'form_url':reverse('photo_update', args=[metastory_id,story_id,multimedia.id]),'upload_form_url':''}, context_instance=RequestContext(request))
     else:
         return HttpResponseRedirect( settings.LOGIN_REDIRECT_URL )
\ No newline at end of file</diff>
      <filename>limestone/photos/views.py</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ from limestone.plaintext.models import PlainText
 class PlainTextForm(forms.ModelForm):
     class Meta:
         model = PlainText
-        exclude = ('story','status','attribution','license','pub_date','authors','created_at','created_by','updated_at','updated_by')
\ No newline at end of file
+        exclude = ('story','status','attribution','license','pub_date','authors','created_at','created_by','updated_at','updated_by','tags')
\ No newline at end of file</diff>
      <filename>limestone/plaintext/forms.py</filename>
    </modified>
    <modified>
      <diff>@@ -48,6 +48,7 @@ def edit_plaintext(request,metastory_id,story_id,multimedia_id):
     multimedia = get_object_or_404(PlainText, pk=multimedia_id, story=story)
     form = PlainTextForm(instance=multimedia)
     members = auth.User.objects.filter(newsroom_members__metastory_newsrooms__newsrooms__id__in=metastory.newsrooms.values_list('id',flat=True)).distinct()
+    authors = multimedia.authors.all()
     
     inherited_tags = []
     inherited_tag_ids = []
@@ -65,7 +66,7 @@ def edit_plaintext(request,metastory_id,story_id,multimedia_id):
     used_tags = multimedia._get_tags()
     
     breadcrumb = [ {'title':metastory,'url':reverse('metastory_edit', args=[metastory_id])} , {'title':story,'url':reverse('story_edit', args=[metastory_id,story_id])} , {'title':multimedia,'url':reverse('plaintext_edit', args=[metastory_id,story_id,multimedia_id])} ]
-    return render_to_response(&quot;multimedia/plaintext.html&quot;, {'breadcrumb':breadcrumb,'form':form,'newsrooms_members':members,'inherited_tags':inherited_tags,'tags':tags,'used_tags':used_tags,'status':multimedia.status,'form_url':reverse('plaintext_update', args=[metastory_id,story_id,multimedia_id])}, context_instance=RequestContext(request))
+    return render_to_response(&quot;multimedia/plaintext.html&quot;, {'breadcrumb':breadcrumb,'form':form,'newsrooms_members':members,'authors':authors,'inherited_tags':inherited_tags,'tags':tags,'used_tags':used_tags,'status':multimedia.status,'form_url':reverse('plaintext_update', args=[metastory_id,story_id,multimedia_id])}, context_instance=RequestContext(request))
 
 
 @login_required
@@ -78,6 +79,7 @@ def save_plaintext(request,metastory_id,story_id,multimedia_id=None):
         else:
             multimedia = PlainText(created_by = request.user, story=story, created_at = datetime.now())
 
+        
         multimedia.updated_by = request.user
         multimedia.updated_at = datetime.now()
         form = PlainTextForm(request.POST,instance=multimedia)
@@ -86,6 +88,8 @@ def save_plaintext(request,metastory_id,story_id,multimedia_id=None):
             form.save()
             request.user.message_set.create(message=&quot;1|Your plaintext asset was saved successfully.&quot;)
             
+            multimedia.authors = request.POST.getlist('authors')
+            
             stags = ''
             for tag in Tag.objects.all():
                 if request.POST.__contains__('tag_%d' % tag.id):
@@ -95,8 +99,26 @@ def save_plaintext(request,metastory_id,story_id,multimedia_id=None):
             return HttpResponseRedirect( reverse('plaintext_edit', args=[metastory_id,story_id,multimedia.id]) )
         else:
             request.user.message_set.create(message=&quot;0|An error has occured.&quot;)
+            members = auth.User.objects.filter(newsroom_members__metastory_newsrooms__newsrooms__id__in=metastory.newsrooms.values_list('id',flat=True)).distinct()
+            authors = multimedia.authors.all()
+            
+            inherited_tags = []
+            inherited_tag_ids = []
+            for newsroom in metastory.newsrooms.all():
+                for tag in newsroom.get_tags():
+                    inherited_tags.append(tag)
+                    inherited_tag_ids.append(tag.id)
+            for mtag in metastory._get_tags():
+                inherited_tags.append(mtag)
+                inherited_tag_ids.append(mtag.id)
+            for stag in story._get_tags():
+                inherited_tags.append(stag)
+                inherited_tag_ids.append(stag.id)
+            tags = Tag.objects.exclude(id__in=inherited_tag_ids)
+            used_tags = multimedia._get_tags()
+
+            breadcrumb = [ {'title':metastory,'url':reverse('metastory_edit', args=[metastory_id])} , {'title':story,'url':reverse('story_edit', args=[metastory_id,story_id])} , {'title':multimedia,'url':reverse('plaintext_edit', args=[metastory_id,story_id,multimedia_id])} ]
+            return render_to_response(&quot;multimedia/plaintext.html&quot;, {'breadcrumb':breadcrumb,'form':form,'newsrooms_members':members,'authors':authors,'inherited_tags':inherited_tags,'tags':tags,'used_tags':used_tags,'status':multimedia.status,'form_url':reverse('plaintext_update', args=[metastory_id,story_id,multimedia_id])}, context_instance=RequestContext(request))
             
-            tags = Tag.objects.all()
-            return render_to_response( &quot;multimedia/plaintext.html&quot;, {'form':form,'tags':tags}, context_instance=RequestContext(request))
     else:
         return HttpResponseRedirect( settings.LOGIN_REDIRECT_URL )
\ No newline at end of file</diff>
      <filename>limestone/plaintext/views.py</filename>
    </modified>
    <modified>
      <diff>@@ -62,6 +62,7 @@ INSTALLED_APPS = (
 	'django_authopenid',
 	'imagekit',
 	#
+	'limestone.editorsdesk',
 	'limestone.main',
 	'limestone.newsroom',
 	'limestone.partner',</diff>
      <filename>limestone/settings.py</filename>
    </modified>
    <modified>
      <diff>@@ -70,7 +70,10 @@ class Story(models.Model):
 
     def save(self):
         if self.slug is None:
-            self.slug = slugify(self.headline)
+            if len(slugify(self.headline)) &lt; 50:
+                self.slug = slugify(self.headline)
+            else:
+                self.slug = slugify(self.headline)[:50]
         if self.created_at == None:
             self.created_at = datetime.now()
         self.updated_at = datetime.now()</diff>
      <filename>limestone/story/models.py</filename>
    </modified>
    <modified>
      <diff>@@ -96,6 +96,8 @@ def edit_story(request,metastory_id,story_id):
     form = StoryForm(instance=story)
     assets = Media.children.filter(story=story)
     members = auth.User.objects.filter(newsroom_members__metastory_newsrooms__newsrooms__id__in=metastory.newsrooms.values_list('id',flat=True)).distinct()
+    authors = story.authors.all()
+    photos = story.authors.all()
     
     inherited_tags = []
     inherited_tag_ids = []
@@ -110,7 +112,7 @@ def edit_story(request,metastory_id,story_id):
     used_tags = story._get_tags()
     
     breadcrumb = [ {'title':story.metastory,'url':reverse('metastory_edit', args=[metastory_id])} , {'title':story,'url':reverse('story_edit', args=[metastory_id,story_id])} ]
-    return render_to_response(&quot;story/story.html&quot;, {'breadcrumb':breadcrumb,'form':form,'newsrooms_members':members,'media_assets':assets,'inherited_tags':inherited_tags,'tags':tags,'used_tags':used_tags,'form_url':reverse('story_update', args=[metastory_id,story_id]),'metastory_id':metastory_id,'story_id':story_id}, context_instance=RequestContext(request))
+    return render_to_response(&quot;story/story.html&quot;, {'breadcrumb':breadcrumb,'form':form,'newsrooms_members':members,'authors':authors,'media_assets':assets,'inherited_tags':inherited_tags,'tags':tags,'used_tags':used_tags,'form_url':reverse('story_update', args=[metastory_id,story_id]),'metastory_id':metastory_id,'story_id':story_id}, context_instance=RequestContext(request))
 
 
 @login_required
@@ -123,6 +125,7 @@ def save_story(request,metastory_id,story_id=None):
             story = Story(created_by = request.user, metastory=metastory)
 
         #story.metastory=metastory
+        story.authors = request.POST.getlist('authors')
         story.updated_by = request.user
         form = StoryForm(request.POST,instance=story)
         
@@ -142,6 +145,7 @@ def save_story(request,metastory_id,story_id=None):
             
             assets = Media.children.filter(story=story)
             members = auth.User.objects.filter(newsroom_members__metastory_newsrooms__newsrooms__id__in=metastory.newsrooms.values_list('id',flat=True)).distinct()
+            authors = story.authors.all()
 
             inherited_tags = []
             inherited_tag_ids = []
@@ -159,6 +163,6 @@ def save_story(request,metastory_id,story_id=None):
                     used_tags.append(tag)
 
             breadcrumb = [ {'title':story.metastory,'url':reverse('metastory_edit', args=[metastory_id])} , {'title':story,'url':reverse('story_edit', args=[metastory_id,story_id])} ]
-            return render_to_response(&quot;story/story.html&quot;, {'breadcrumb':breadcrumb,'form':form,'newsrooms_members':members,'media_assets':assets,'tags':tags,'used_tags':used_tags,'form_url':reverse('story_update', args=[metastory_id,story_id]),'metastory_id':metastory_id,'story_id':story_id,'inherited_tags':inherited_tags}, context_instance=RequestContext(request))
+            return render_to_response(&quot;story/story.html&quot;, {'breadcrumb':breadcrumb,'form':form,'newsrooms_members':members,'authors':authors,'media_assets':assets,'tags':tags,'used_tags':used_tags,'form_url':reverse('story_update', args=[metastory_id,story_id]),'metastory_id':metastory_id,'story_id':story_id,'inherited_tags':inherited_tags}, context_instance=RequestContext(request))
     else:
         return HttpResponseRedirect( settings.LOGIN_REDIRECT_URL )
\ No newline at end of file</diff>
      <filename>limestone/story/views.py</filename>
    </modified>
    <modified>
      <diff>@@ -19,6 +19,10 @@
 		{% block extra_styles %}{% endblock %}
 		
         {% block head %}{% endblock %}
+
+		&lt;style type=&quot;text/css&quot; media=&quot;screen&quot;&gt;
+			{% block inline_styles %}}{% endblock %}
+		&lt;/style&gt;
 		
 		{% block feeds %}{% endblock %}
     &lt;/head&gt;</diff>
      <filename>limestone/templates/n21alpha/base.html</filename>
    </modified>
    <modified>
      <diff>@@ -6,25 +6,35 @@
 
 {% block content %}
 
+&lt;div class=&quot;grid_16 genericForm&quot;&gt;
 &lt;h3&gt;Create Your Account Association&lt;/h3&gt;
+&lt;/div&gt;
 
+&lt;div class=&quot;grid_16 genericForm&quot;&gt;
 &lt;h4&gt;Are you part of one of our newsrooms?&lt;/h4&gt;
-&lt;div&gt;If so, click that newsroom's name to create your newsroom account.
+If so, click that newsroom's name to create your newsroom account.
 &lt;br/&gt;&lt;br/&gt;
 {% for newsroom in newsrooms %}
 &lt;div&gt;
 	&lt;a href=&quot;/newsroom/{{newsroom.id}}/member/add/&quot;&gt;{{ newsroom }}&lt;/a&gt;
 &lt;/div&gt;
 {% endfor %}
+&lt;br/&gt;&lt;br/&gt;
 &lt;/div&gt;
-&lt;br/&gt;
 
+
+
+&lt;div class=&quot;grid_16 genericForm&quot;&gt;
 &lt;h4&gt;Or ... Are you a partner who would like access to our content?&lt;/h4&gt;
-&lt;div&gt;Fill out the following fields and we will create your partner account.
+Fill out the following fields and we will create your partner account.
 &lt;br/&gt;&lt;br/&gt;
 &lt;form action=&quot;/partner/member/add/&quot; method=&quot;post&quot;&gt;
-{{ form }}
-&lt;input type=&quot;submit&quot; value=&quot;Create&quot; /&gt;
+{{ form.as_p }}
+
+&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;
+&lt;div class=&quot;inputSubmit&quot;&gt;
+	&lt;input type=&quot;submit&quot; value=&quot;Create &amp;rarr;&quot;&gt;
+&lt;/div&gt;
 &lt;/form&gt;
 &lt;/div&gt;
 </diff>
      <filename>limestone/templates/n21alpha/main/association.html</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,32 @@
 {% extends &quot;base.html&quot; %}
 
+
+{% load smart_if %}
+
+
 {% block extra_scripts %}
 &lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.2/scriptaculous.js&quot;&gt;&lt;/script&gt;
 &lt;script type=&quot;text/javascript&quot; src=&quot;{{ MEDIA_URL }}templates/n21alpha/js/lightbox.js&quot;&gt;&lt;/script&gt;
 {% endblock %}
+
+
+{% block hightlight_error %}
+	{% if messages %}
+	&lt;div class=&quot;grid_16&quot;&gt;
+	    {% for message in messages %}
+			&lt;div class=&quot;ui-widget&quot;&gt;
+				{% if message|slice:&quot;0:1&quot; == &quot;1&quot; %}
+				&lt;div class=&quot;ui-state-highlight ui-corner-all&quot; style=&quot;padding:2px 5px 2px 5px; margin:10px 0px 10px 0px;&quot;&gt;
+					&lt;span class=&quot;ui-icon ui-icon-info&quot; style=&quot;float: left; margin-right:5px;&quot;&gt;&lt;/span&gt; &lt;strong&gt;Success&lt;/strong&gt; : {{ message|slice:&quot;2:&quot; }}
+				&lt;/div&gt;
+				{% else %}
+				&lt;div class=&quot;ui-state-error ui-corner-all&quot; style=&quot;padding:2px 5px 2px 5px; margin:10px 0px 10px 0px;&quot;&gt;
+					&lt;span class=&quot;ui-icon ui-icon-alert&quot; style=&quot;float: left; margin-right:5px;&quot;&gt;&lt;/span&gt; &lt;strong&gt;Alert&lt;/strong&gt; : {{ message|slice:&quot;2:&quot; }}
+				&lt;/div&gt;
+				{% endif %}
+			&lt;/div&gt;
+	    {% endfor %}
+	&lt;/div&gt;
+	{% endif %}
+{% endblock %}
\ No newline at end of file</diff>
      <filename>limestone/templates/n21alpha/main/base_main.html</filename>
    </modified>
    <modified>
      <diff>@@ -14,7 +14,7 @@
 	&lt;h4&gt;Recent Activity&lt;/h4&gt;
 	{% for entry in entries %}
 	&lt;div&gt;
-		&lt;a href=&quot;#&quot;&gt;{{ entry }}&lt;/a&gt;
+		&lt;span class=&quot;icon-{% if entry.status == &quot;Approved&quot; %}accept{% else %}exclamation{% endif %}&quot;&gt;&lt;/span&gt; {{ entry.status }} &lt;a href=&quot;#&quot;&gt;{{ entry }}&lt;/a&gt; {{ entry.updated_at|date }} {{ entry.updated_by }}
 	&lt;/div&gt;
 	{% endfor %}
 	</diff>
      <filename>limestone/templates/n21alpha/main/dashboard.html</filename>
    </modified>
    <modified>
      <diff>@@ -7,8 +7,17 @@
 
 {% block content %}
 
-&lt;div class=&quot;grid_16 genericForm&quot;&gt;
-	&lt;form action=&quot;{{ form_url }}&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
+{% if not image %}
+&lt;div id=&quot;upload_dialog&quot; class=&quot;upload_dialog&quot; title=&quot;Upload Photo&quot;&gt;
+	&lt;form action=&quot;{{ upload_form_url }}&quot; name=&quot;upload_form&quot; id=&quot;upload_form&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt;
+		{{ upload_form.as_p }}
+	&lt;/form&gt;
+&lt;/div&gt;
+{% endif %}
+
+
+&lt;div class=&quot;grid_10 genericForm&quot;&gt;
+	&lt;form action=&quot;{{ form_url }}&quot; method=&quot;post&quot;&gt;
 	&lt;h4&gt;Photo Info&lt;/h4&gt;
 	{% if status.length %}
 	&lt;p&gt;
@@ -16,12 +25,11 @@
 	&lt;/p&gt;
 	{% endif %}
 	{{ form.as_p }}
-	{{ upload_form.as_p }}
 	&lt;p&gt;
 		&lt;label for=&quot;id_authors&quot;&gt;Authors:&lt;/label&gt;
 		&lt;select name=&quot;authors&quot; id=&quot;id_authors&quot; multiple size=&quot;8&quot;&gt;
 			{% for member in newsrooms_members %}
-				&lt;option value=&quot;{{member}}&quot;&gt;{{ member }} ( {%for newsroom in member.newsroom_members.all%} {{ newsroom }} {% endfor %} ) &lt;/option&gt;
+				&lt;option {% for author in authors %} {% if member == author %} selected {% endif %} {% endfor %}  value=&quot;{{member.id}}&quot;&gt;{{ member }} ( {%for newsroom in member.newsroom_members.all%} {{ newsroom }} {% endfor %} ) &lt;/option&gt;
 			{% endfor %}
 		&lt;/select&gt;
 	&lt;/p&gt;
@@ -34,18 +42,57 @@
 		&lt;label&gt;Tags:&lt;/label&gt;
 		&lt;span class=&quot;inputDiv&quot;&gt;
 		{% for tag in tags %}
-			&lt;input type=&quot;checkbox&quot; name=&quot;tag_{{tag.id}}&quot; value=&quot;{{tag}}&quot; id=&quot;tag_{{tag.id}}&quot;&gt; {{tag}}
+			&lt;input type=&quot;checkbox&quot; name=&quot;tag_{{tag.id}}&quot; value=&quot;{{tag}}&quot; id=&quot;tag_{{tag.id}}&quot;  {% for used_tag in used_tags %} {% if tag.id == used_tag.id %} checked {% endif %} {% endfor %} &gt; {{tag}}
 			{% if forloop.counter|divisibleby:4 %}&lt;br/&gt;{% endif %}
 		{% endfor %}
 		&lt;/span&gt;
 	&lt;/p&gt;
 	&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;
 	&lt;div class=&quot;inputSubmit&quot;&gt;
+		{% if image %}
 		&lt;input type=&quot;submit&quot; value=&quot;Continue &amp;rarr;&quot;&gt;
+		{% endif %}
 	&lt;/div&gt;
 	&lt;/form&gt;
 &lt;/div&gt;	
 
+&lt;div class=&quot;grid_6&quot;&gt;
+	{% if image %}
+	&lt;h4&gt;Metadata &amp; URLs&lt;/h4&gt;
+	&lt;img src=&quot;{{ image.get_thumbnail_url }}&quot; /&gt;
+	&lt;div&gt;Original Image:
+		&lt;ul&gt;
+			&lt;li style=&quot;list-style-type:none;&quot;&gt;Width : {{ image.get_width }}&lt;/li&gt;
+			&lt;li style=&quot;list-style-type:none;&quot;&gt;Height : {{ image.get_height }}&lt;/li&gt;
+			&lt;li style=&quot;list-style-type:none;&quot;&gt;URL : &lt;a href=&quot;{{ image.get_original_url }}&quot; target=&quot;_blank&quot;&gt;{{ image.get_original_url }}&lt;/a&gt;&lt;/li&gt;
+			&lt;li style=&quot;list-style-type:none;&quot;&gt;::METADATA::&lt;/li&gt;
+			{% for key,value in image.get_info.items %}
+			&lt;li style=&quot;list-style-type:none;&quot;&gt;{{ key }} : {{ value }}&lt;/li&gt;
+			{% endfor %}
+		&lt;/ul&gt;
+	&lt;/div&gt;
+	{% endif %}
+&lt;/div&gt;
+
 &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;
 
+{% endblock %}
+
+{% block inline_styles %}
+	.ui-dialog-titlebar-close { display: none; }
+{% endblock %}
+
+{% block inline_scripts %}
+	{% if not image %}
+	$(function() {
+		$(&quot;#upload_dialog&quot;).dialog({
+			bgiframe: true,
+			modal: true,
+			closeOnEscape : false,
+			resizable : false,
+			buttons: { &quot;Upload&quot;: function() { $(&quot;#upload_form&quot;).submit(); } }
+		});
+		
+	});
+	{% endif %}
 {% endblock %}
\ No newline at end of file</diff>
      <filename>limestone/templates/n21alpha/multimedia/photo.html</filename>
    </modified>
    <modified>
      <diff>@@ -18,9 +18,9 @@
 	{{ form.as_p }}
 	&lt;p&gt;
 		&lt;label for=&quot;id_authors&quot;&gt;Authors:&lt;/label&gt;
-		&lt;select name=&quot;authors&quot; id=&quot;id_authors&quot; multiple size=&quot;8&quot;&gt;
+		&lt;select name=&quot;authors&quot; id=&quot;id_authors&quot; multiple=&quot;multiple&quot; size=&quot;8&quot;&gt;
 			{% for member in newsrooms_members %}
-				&lt;option value=&quot;{{member}}&quot;&gt;{{ member }} ( {%for newsroom in member.newsroom_members.all%} {{ newsroom }} {% endfor %} ) &lt;/option&gt;
+				&lt;option {% for author in authors %} {% if member == author %} selected {% endif %} {% endfor %} value=&quot;{{member.id}}&quot;&gt;{{ member }} ( {%for newsroom in member.newsroom_members.all%} {{ newsroom }} {% endfor %} ) &lt;/option&gt;
 			{% endfor %}
 		&lt;/select&gt;
 	&lt;/p&gt;
@@ -33,7 +33,7 @@
 		&lt;label&gt;Tags:&lt;/label&gt;
 		&lt;span class=&quot;inputDiv&quot;&gt;
 		{% for tag in tags %}
-			&lt;input type=&quot;checkbox&quot; name=&quot;tag_{{tag.id}}&quot; value=&quot;{{tag}}&quot; id=&quot;tag_{{tag.id}}&quot;&gt; {{tag}}
+			&lt;input type=&quot;checkbox&quot; name=&quot;tag_{{tag.id}}&quot; value=&quot;{{tag}}&quot; id=&quot;tag_{{tag.id}}&quot;  {% for used_tag in used_tags %} {% if tag.id == used_tag.id %} checked {% endif %} {% endfor %} &gt; {{tag}}
 			{% if forloop.counter|divisibleby:4 %}&lt;br/&gt;{% endif %}
 		{% endfor %}
 		&lt;/span&gt;</diff>
      <filename>limestone/templates/n21alpha/multimedia/plaintext.html</filename>
    </modified>
    <modified>
      <diff>@@ -12,9 +12,9 @@
 		{{ form.as_p }}
 		&lt;p&gt;
 			&lt;label for=&quot;id_authors&quot;&gt;Authors:&lt;/label&gt;
-			&lt;select name=&quot;authors&quot; id=&quot;id_authors&quot; multiple size=&quot;8&quot;&gt;
+			&lt;select name=&quot;authors&quot; id=&quot;id_authors&quot; multiple=&quot;true&quot; size=&quot;8&quot;&gt;
 				{% for member in newsrooms_members %}
-					&lt;option value=&quot;{{member}}&quot;&gt;{{ member }} ( {%for newsroom in member.newsroom_members.all%} {{ newsroom }} {% endfor %} ) &lt;/option&gt;
+					&lt;option {% for author in authors %} {% if member == author %} selected {% endif %} {% endfor %}  value=&quot;{{member.id}}&quot;&gt;{{ member }} ( {%for newsroom in member.newsroom_members.all%} {{ newsroom }} {% endfor %} ) &lt;/option&gt;
 				{% endfor %}
 			&lt;/select&gt;
 		&lt;/p&gt;
@@ -53,8 +53,13 @@
 			&lt;div&gt;You have not created any media assets yet.&lt;/div&gt;
 		{% endif %}
 		{% for asset in media_assets %}
-		&lt;div&gt;
-			&lt;a href=&quot;{% url plaintext_edit metastory_id story_id asset.id %}&quot;&gt;{{ asset }}&lt;/a&gt;
+		&lt;div class=&quot;sidebar-right-listing alternating-row-{% if forloop.counter|divisibleby:2 %}even{% else %}odd{% endif %}&quot;&gt;
+			{% if asset.get_child_name == &quot;photo&quot; %}
+			&lt;span class=&quot;icon-photo&quot;&gt;&lt;/span&gt;&lt;a href=&quot;{% url photo_edit metastory_id story_id asset.id %}&quot;&gt;{{ asset }}&lt;/a&gt;
+			{% endif %}
+			{% if asset.get_child_name == &quot;plaintext&quot; %}
+			&lt;span class=&quot;icon-plaintext&quot;&gt;&lt;/span&gt;&lt;a href=&quot;{% url plaintext_edit metastory_id story_id asset.id %}&quot;&gt;{{ asset }}&lt;/a&gt;
+			{% endif %}
 			&lt;br/&gt;
 			&lt;span class=&quot;icon-{% if asset.status == &quot;Approved&quot; %}accept{% else %}exclamation{% endif %}&quot;&gt;&lt;/span&gt; {{ asset.status }}
 		&lt;/div&gt;</diff>
      <filename>limestone/templates/n21alpha/story/story.html</filename>
    </modified>
    <modified>
      <diff>@@ -19,6 +19,7 @@ urlpatterns = patterns(
     url(r'^privacy/', 'limestone.main.views.privacy',  name='privacy'),
 	url(r'^terms/', 'limestone.main.views.terms',  name='terms'),
     
+    (r'^editorsdesk/',include('limestone.editorsdesk.urls')),
     (r'^newsroom/',include('limestone.newsroom.urls')),
     (r'^partner/',include('limestone.partner.urls')),
     (r'^builder/',include('limestone.story.urls')),</diff>
      <filename>limestone/urls.py</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>limestone/photos/migrations/0002_removed_save_audit.py</filename>
    </removed>
    <removed>
      <filename>limestone/photos/templatetags/.svn/all-wcprops</filename>
    </removed>
    <removed>
      <filename>limestone/photos/templatetags/.svn/entries</filename>
    </removed>
    <removed>
      <filename>limestone/photos/templatetags/.svn/format</filename>
    </removed>
    <removed>
      <filename>limestone/photos/templatetags/.svn/text-base/__init__.py.svn-base</filename>
    </removed>
    <removed>
      <filename>limestone/photos/templatetags/.svn/text-base/photos_tags.py.svn-base</filename>
    </removed>
    <removed>
      <filename>limestone/photos/templatetags/__init__.py</filename>
    </removed>
    <removed>
      <filename>limestone/photos/templatetags/photos_tags.py</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>a1667100822685cef362d0bb38ee177a68906fb9</id>
    </parent>
  </parents>
  <author>
    <name>bhalle</name>
    <email>bhalle@jrn368.dhcp.asu.edu</email>
  </author>
  <url>http://github.com/bhalle/limestone/commit/d164980f5559fd34b7a514317cccc45e75efd45f</url>
  <id>d164980f5559fd34b7a514317cccc45e75efd45f</id>
  <committed-date>2009-11-03T15:59:41-08:00</committed-date>
  <authored-date>2009-11-03T15:59:41-08:00</authored-date>
  <message>finalized photo asset, created editors desk, partner association</message>
  <tree>bd4cabc213b5e4f8d66f458834c9bf810bb59495</tree>
  <committer>
    <name>bhalle</name>
    <email>bhalle@jrn368.dhcp.asu.edu</email>
  </committer>
</commit>
