1 from __future__ import absolute_import, print_function, unicode_literals
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
23 from experiments.models import Lane
24 from inventory.models import PrinterTemplate
25 from bcmagic.utils import print_zpl_socket
27 # Let's disable those pesky delete everything by accident features.
28 admin.site.disable_action('delete_selected')
31 class AccessionAgencyOptions(admin.ModelAdmin):
32 model = AccessionAgency
35 class LibraryAccessionOptions(admin.ModelAdmin):
36 model = LibraryAccession
37 search_fields = ('accession', 'library')
38 list_filter = ('agency', 'created',)
39 list_display = ('accession', 'library', 'created')
42 class LibraryAccessionInline(admin.TabularInline):
43 model = LibraryAccession
46 'fields': ('agency', 'accession', 'accession_url')
51 class AffiliationOptions(admin.ModelAdmin):
52 list_display = ('name', 'contact', 'email')
55 'fields': (('name', 'contact', 'email', 'users'))
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 }
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(
72 # print db_field.name, kwargs
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')
84 'fields': (('antigene', 'nickname', 'antibodies'),
85 ('catalog', 'source'),
92 class CelllineOptions(admin.ModelAdmin):
93 list_display = ('cellline_name', 'notes')
94 search_fields = ('cellline_name', 'nickname', 'notes')
97 'fields': (('cellline_name', 'nickname',),
103 class ConditionOptions(admin.ModelAdmin):
104 list_display = (('condition_name'), ('notes'),)
107 'fields': (('condition_name'),
114 class ExperimentTypeOptions(admin.ModelAdmin):
115 model = ExperimentType
116 list_display = ('name',)
117 fieldsets = ((None, {'fields': ('name',)}),)
120 class HTSUserCreationForm(UserCreationForm):
123 fields = ('username', 'first_name', 'last_name')
126 class HTSUserChangeForm(UserChangeForm):
129 fields = ('username', 'first_name', 'last_name')
132 class HTSUserOptions(UserAdmin):
133 form = HTSUserChangeForm
134 add_form = HTSUserCreationForm
137 class LaneLibraryInline(admin.StackedInline):
142 class Library_Inline(admin.TabularInline):
146 class LibraryTypeOptions(admin.ModelAdmin):
147 list_display = ['name', 'is_paired_end', 'can_multiplex']
151 class MultiplexIndexOptions(admin.ModelAdmin):
152 model = MultiplexIndex
153 list_display = ['adapter_type', 'multiplex_id', 'sequence']
156 class LibraryOptions(admin.ModelAdmin):
159 "all": ("css/wide_account_number.css",)
162 date_hierarchy = "creation_date"
168 'cell_line__cellline_name',
169 'library_species__scientific_name',
170 'library_species__common_name',
171 'libraryaccession__accession',
176 'index_sequence_text',
178 'undiluted_concentration',
192 list_display_links = ('id', 'library_name',)
196 ('id', 'library_name', 'hidden'),
197 ('library_species', 'experiment_type'),
198 ('library_type', 'multiplex_id'),
201 ('Experiment Detail:', {
203 ('cell_line', 'replicate',),
207 'classes': ('collapse',),
209 ('Creation Information:', {
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'),
218 ('Library/Project Affiliation:', {
219 'fields': (('account_number', 'affiliations'),)
224 LibraryAccessionInline,
226 actions = ['action_print_library_labels']
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.
233 # Probably should ask if the user really meant to print all selected
234 # libraries if the count is above X. X=10 maybe?
236 # Grab the library template
237 # FIXME: Hardcoding library template name. Not a good idea... *sigh*.
238 EVIL_HARDCODED_LIBRARY_TEMPLATE_NAME = "Library"
241 template = PrinterTemplate.objects.get(
242 item_type__name=EVIL_HARDCODED_LIBRARY_TEMPLATE_NAME)
243 except PrinterTemplate.DoesNotExist:
246 "Could not find a library template with ItemType.name of '%s'" %
247 (EVIL_HARDCODED_LIBRARY_TEMPLATE_NAME))
251 t = Template(template.template)
254 # Iterate over selected labels to print
255 for library in queryset.all():
257 # Django Template Context
258 c = Context({'library': library})
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))
264 print_zpl_socket(zpl_list, host=template.printer.ip_address)
266 self.message_user(request, "%s labels printed." % (len(queryset)))
268 action_print_library_labels.short_description = "Print Labels"
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)
277 field = super(LibraryOptions, self).formfield_for_dbfield(db_field,
279 # Override field attributes
280 if db_field.name == "bioanalyzer_summary":
281 field.widget.attrs["rows"] = "3"
285 class SpeciesOptions(admin.ModelAdmin):
288 'fields': (('scientific_name', 'common_name'),)
293 class TagOptions(admin.ModelAdmin):
294 list_display = ('tag_name', 'context')
297 'fields': ('tag_name', 'context')
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)