6db3ba831e59cb88d0fe397ae470e7e802156892
[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         'gel_cut_size',
117         'creation_date',
118     )
119     list_filter = (
120         'hidden',
121         'affiliations',
122         'library_species', 
123         'experiment_type', 
124         'made_by', 
125         'cell_line',
126         'stopping_point',)
127     list_display_links = ('id', 'library_name',)
128     fieldsets = (
129       (None, {
130         'fields': (
131           ('id','library_name','hidden'),
132           ('library_species', 'cell_line', 'replicate'),
133           ('library_type', 'experiment_type'))
134          }),
135          ('Creation Information:', {
136              'fields' : (('made_by', 'creation_date', 'stopping_point'), 
137                          ('amplified_from_sample'), 
138                          ('gel_cut_size', 'insert_size', 
139                           'undiluted_concentration'), 
140                          ('bioanalyzer_concentration','bioanalyzer_image_url'),
141                          ('bioanalyzer_summary'), 
142                          ('notes'))
143          }),
144          ('Library/Project Affiliation:', {
145              'fields' : (('account_number', 'affiliations'),)
146          }),
147          )
148     inlines = [
149       LaneLibraryInline,
150     ]
151     actions = ['action_print_library_labels']
152     
153     def action_print_library_labels(self, request, queryset):
154         """
155         Django action which prints labels for the selected set of labels from the
156         Django Admin interface.
157         """
158         
159         #Probably should ask if the user really meant to print all selected
160         # libraries if the count is above X. X=10 maybe?
161         
162         # Grab the library template
163         #FIXME: Hardcoding library template name. Not a good idea... *sigh*.
164         EVIL_HARDCODED_LIBRARY_TEMPLATE_NAME = "Library"
165         
166         try:
167             template = PrinterTemplate.objects.get(item_type__name=EVIL_HARDCODED_LIBRARY_TEMPLATE_NAME)
168         except PrinterTemplate.DoesNotExist:
169             self.message_user(request, "Could not find a library template with ItemType.name of '%s'" % \
170                               (EVIL_HARDCODED_LIBRARY_TEMPLATE_NAME))
171             return
172         
173         # ZPL Template
174         t = Template(template.template)
175         
176         zpl_list = []
177         #Iterate over selected labels to print
178         for library in queryset.all():
179             
180             # Django Template Context
181             c = Context({'library': library})
182             
183             # Send rendered template to the printer that the template
184             #  object has been attached to in the database.
185             zpl_list.append(t.render(c))
186         
187         print_zpl_socket(zpl_list, host=template.printer.ip_address)
188     
189         self.message_user(request, "%s labels printed." % (len(queryset)))
190                           
191     action_print_library_labels.short_description = "Print Labels"
192
193     def formfield_for_dbfield(self, db_field, **kwargs):
194         # Override Field type
195         if db_field.name in ('affiliations', 'tags'):
196             kwargs['widget'] = widgets.FilteredSelectMultiple(
197                 db_field.verbose_name,
198                 (db_field.name in self.filter_vertical)
199             )
200         field = super(LibraryOptions, self).formfield_for_dbfield(db_field,
201                                                                   **kwargs)
202         # Override field attributes
203         if db_field.name == "bioanalyzer_summary":
204             field.widget.attrs["rows"] = "3"
205         return field
206
207 class SpeciesOptions(admin.ModelAdmin):
208     fieldsets = (
209       (None, {
210           'fields': (('scientific_name', 'common_name'),)
211       }),
212     )
213
214 class TagOptions(admin.ModelAdmin):
215     list_display = ('tag_name', 'context')
216     fieldsets = ( 
217         (None, {
218           'fields': ('tag_name', 'context')
219           }),
220         )
221
222 admin.site.register(Library, LibraryOptions)
223 admin.site.register(Affiliation, AffiliationOptions)
224 #admin.site.register(Antibody, AntibodyOptions)
225 admin.site.register(Cellline, CelllineOptions)
226 #admin.site.register(Condition, ConditionOptions)
227 admin.site.register(ExperimentType, ExperimentTypeOptions)
228 #admin.site.register(HTSUser, HTSUserOptions)
229 admin.site.register(LibraryType, LibraryTypeOptions)
230 admin.site.register(Species, SpeciesOptions)
231 #admin.site.register(Tag, TagOptions)