83aa70e745e59c3bb28932a91fed109c5a18868a
[htsworkflow.git] / htsworkflow / frontend / samples / admin.py
1 from django.contrib import admin
2 from django.contrib.admin import widgets
3 from django.contrib.admin.models import User
4 from django.contrib.auth.admin import UserAdmin
5 from django.contrib.auth.forms import UserCreationForm, UserChangeForm
6 from django.template import Context, Template
7 from django.db import models
8 from django.utils.translation import ugettext_lazy as _
9 from django.forms import TextInput, Textarea
10
11 from htsworkflow.frontend.samples.models import Antibody, Cellline, Condition, ExperimentType, HTSUser, LibraryType, Species, Affiliation, Library, Tag
12 from htsworkflow.frontend.experiments.models import Lane
13 from htsworkflow.frontend.inventory.models import PrinterTemplate
14 from htsworkflow.frontend.bcmagic.utils import print_zpl_socket
15
16 # Let's disable those pesky delete everything by accident features.
17 admin.site.disable_action('delete_selected')
18
19 class AffiliationOptions(admin.ModelAdmin):
20     list_display = ('name','contact','email')
21     fieldsets = (
22       (None, {
23           'fields': (('name','contact','email','users'))
24       }),
25     )
26
27     # some post 1.0.2 version of django has formfield_overrides 
28     # which would replace this code with:
29     # formfield_overrids = {
30     #   models.ManyToMany: { 'widget': widgets.FilteredSelectMultiple }
31     # }
32     def formfield_for_dbfield(self, db_field, **kwargs):
33       if db_field.name == 'users':
34         kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical))
35       rv = super(AffiliationOptions, self).formfield_for_dbfield(db_field, **kwargs)
36     #  print db_field.name, kwargs
37       return rv
38
39 class AntibodyOptions(admin.ModelAdmin):
40     search_fields = ('antigene','nickname','catalog','antibodies','source','biology','notes')
41     list_display = ('antigene','nickname','antibodies','catalog','source','biology','notes')
42     list_filter = ('antibodies','source')
43     fieldsets = (
44       (None, {
45           'fields': (('antigene','nickname','antibodies'),('catalog','source'),('biology'),('notes'))
46       }),
47      )
48
49 class CelllineOptions(admin.ModelAdmin):
50     list_display = ('cellline_name', 'nickname', 'notes')
51     search_fields = ('cellline_name', 'nickname', 'notes')
52     fieldsets = (
53       (None, {
54           'fields': (('cellline_name'),('notes'),)
55       }),
56      )
57
58 class ConditionOptions(admin.ModelAdmin):
59     list_display = (('condition_name'), ('notes'),)
60     fieldsets = (
61       (None, {
62           'fields': (('condition_name'),('nickname'),('notes'),)
63       }),
64      )
65
66 class ExperimentTypeOptions(admin.ModelAdmin):
67   model = ExperimentType
68   #list_display = ('name',)
69   #fieldsets = ( (None, { 'fields': ('name',) }), )
70
71 class HTSUserCreationForm(UserCreationForm):
72     class Meta:
73         model = HTSUser
74         fields = ("username",'first_name','last_name')
75
76 class HTSUserChangeForm(UserChangeForm):
77     class Meta:
78         model = HTSUser
79         
80 class HTSUserOptions(UserAdmin):
81     form = HTSUserChangeForm
82     add_form = HTSUserCreationForm
83
84 class LaneLibraryInline(admin.StackedInline):
85   model = Lane
86   extra = 0
87
88 class Library_Inline(admin.TabularInline):
89   model = Library
90
91 class LibraryTypeOptions(admin.ModelAdmin):
92     model = LibraryType
93
94 class LibraryOptions(admin.ModelAdmin):
95     class Media:
96         css = {
97             "all": ("css/wide_account_number.css",)
98             }
99         
100     date_hierarchy = "creation_date"
101     save_as = True
102     save_on_top = True
103     search_fields = (
104         'id',
105         'library_name',
106         'cell_line__cellline_name',
107         'library_species__scientific_name',
108         'library_species__common_name',
109     )
110     list_display = (
111         'id',
112         'library_name',
113         'public',
114         'affiliation',
115         'undiluted_concentration',
116         'creation_date',
117         'stopping_point',
118     )
119     list_filter = (
120         'experiment_type', 
121         'library_species', 
122         'tags',
123         'affiliations',
124         'made_by', 
125         'antibody',
126         'cell_line',
127         'condition',
128         'stopping_point',
129         'hidden')
130     list_display_links = ('id', 'library_name',)
131     fieldsets = (
132       (None, {
133         'fields': (
134           ('id','library_name','hidden'),
135           ('library_species', 'cell_line', 'replicate'),
136           ('library_type', 'experiment_type'))
137          }),
138          ('Creation Information:', {
139              'fields' : (('made_by', 'creation_date', 'stopping_point'), 
140                          ('amplified_from_sample'), 
141                          ('gel_cut_size', 'insert_size', 
142                           'undiluted_concentration'), 
143                          ('bioanalyzer_concentration','bioanalyzer_image_url'),
144                          ('bioanalyzer_summary'), 
145                          ('notes'))
146          }),
147          ('Library/Project Affiliation:', {
148              'fields' : (('account_number', 'affiliations'),)
149          }),
150          )
151     inlines = [
152       LaneLibraryInline,
153     ]
154     actions = ['action_print_library_labels']
155     
156     def action_print_library_labels(self, request, queryset):
157         """
158         Django action which prints labels for the selected set of labels from the
159         Django Admin interface.
160         """
161         
162         #Probably should ask if the user really meant to print all selected
163         # libraries if the count is above X. X=10 maybe?
164         
165         # Grab the library template
166         #FIXME: Hardcoding library template name. Not a good idea... *sigh*.
167         EVIL_HARDCODED_LIBRARY_TEMPLATE_NAME = "Library"
168         
169         try:
170             template = PrinterTemplate.objects.get(item_type__name=EVIL_HARDCODED_LIBRARY_TEMPLATE_NAME)
171         except PrinterTemplate.DoesNotExist:
172             self.message_user(request, "Could not find a library template with ItemType.name of '%s'" % \
173                               (EVIL_HARDCODED_LIBRARY_TEMPLATE_NAME))
174             return
175         
176         # ZPL Template
177         t = Template(template.template)
178         
179         zpl_list = []
180         #Iterate over selected labels to print
181         for library in queryset.all():
182             
183             # Django Template Context
184             c = Context({'library': library})
185             
186             # Send rendered template to the printer that the template
187             #  object has been attached to in the database.
188             zpl_list.append(t.render(c))
189         
190         print_zpl_socket(zpl_list, host=template.printer.ip_address)
191     
192         self.message_user(request, "%s labels printed." % (len(queryset)))
193                           
194     action_print_library_labels.short_description = "Print Labels"
195
196     def formfield_for_dbfield(self, db_field, **kwargs):
197         # Override Field type
198         if db_field.name in ('affiliations', 'tags'):
199             kwargs['widget'] = widgets.FilteredSelectMultiple(
200                 db_field.verbose_name,
201                 (db_field.name in self.filter_vertical)
202             )
203         field = super(LibraryOptions, self).formfield_for_dbfield(db_field,
204                                                                   **kwargs)
205         # Override field attributes
206         if db_field.name == "bioanalyzer_summary":
207             field.widget.attrs["rows"] = "3"
208         return field
209
210 class SpeciesOptions(admin.ModelAdmin):
211     fieldsets = (
212       (None, {
213           'fields': (('scientific_name', 'common_name'),)
214       }),
215     )
216
217 class TagOptions(admin.ModelAdmin):
218     list_display = ('tag_name', 'context')
219     fieldsets = ( 
220         (None, {
221           'fields': ('tag_name', 'context')
222           }),
223         )
224
225 admin.site.register(Library, LibraryOptions)
226 admin.site.register(Affiliation, AffiliationOptions)
227 #admin.site.register(Antibody, AntibodyOptions)
228 admin.site.register(Cellline, CelllineOptions)
229 #admin.site.register(Condition, ConditionOptions)
230 admin.site.register(ExperimentType, ExperimentTypeOptions)
231 #admin.site.register(HTSUser, HTSUserOptions)
232 admin.site.register(LibraryType, LibraryTypeOptions)
233 admin.site.register(Species, SpeciesOptions)
234 #admin.site.register(Tag, TagOptions)