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