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