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