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