aboutsummaryrefslogtreecommitdiff
path: root/wqflask
diff options
context:
space:
mode:
authorLei Yan2016-06-16 18:21:01 +0000
committerLei Yan2016-06-16 18:21:01 +0000
commit4fec0e6fc0772785a30451d417082bc189f2f6dd (patch)
tree6548c2d088d5a80561e23df076456caaeda195c7 /wqflask
parente55f38a72d47fbdf5f652a08e8da1db78f1dcdb5 (diff)
parentd90dc3748557d1d6fbaa59f71fe676b8a7c393ca (diff)
downloadgenenetwork2-4fec0e6fc0772785a30451d417082bc189f2f6dd.tar.gz
Merge /home/gn2/gene
Diffstat (limited to 'wqflask')
-rw-r--r--wqflask/base/GeneralObject.py68
-rw-r--r--[-rwxr-xr-x]wqflask/base/data_set.py435
-rw-r--r--[-rwxr-xr-x]wqflask/base/trait.py243
-rwxr-xr-xwqflask/base/webqtlCaseData.py3
-rw-r--r--[-rwxr-xr-x]wqflask/base/webqtlConfig.py50
-rwxr-xr-xwqflask/base/webqtlFormData.py2
-rwxr-xr-xwqflask/basicStatistics/BasicStatisticsFunctions.py6
-rwxr-xr-xwqflask/maintenance/gen_select_dataset.py3
-rwxr-xr-xwqflask/maintenance/get_group_samplelists.py3
-rwxr-xr-xwqflask/runserver.py4
-rwxr-xr-xwqflask/secure_server.py75
-rw-r--r--[-rwxr-xr-x]wqflask/utility/Plot.py353
-rw-r--r--wqflask/utility/external.py9
-rw-r--r--wqflask/utility/genofile_parser.py100
-rw-r--r--wqflask/utility/tools.py189
-rwxr-xr-xwqflask/utility/webqtlUtil.py2
-rw-r--r--[-rwxr-xr-x]wqflask/wqflask/collect.py4
-rw-r--r--[-rwxr-xr-x]wqflask/wqflask/correlation/show_corr_results.py565
-rwxr-xr-xwqflask/wqflask/correlation_matrix/show_corr_matrix.py1
-rwxr-xr-xwqflask/wqflask/ctl/__init__.py0
-rw-r--r--wqflask/wqflask/ctl/ctl_analysis.py194
-rwxr-xr-xwqflask/wqflask/database.py5
-rwxr-xr-xwqflask/wqflask/do_search.py4
-rw-r--r--[-rwxr-xr-x]wqflask/wqflask/gsearch.py166
-rw-r--r--wqflask/wqflask/heatmap/heatmap.py9
-rw-r--r--[-rwxr-xr-x]wqflask/wqflask/interval_analyst/GeneUtil.py98
-rwxr-xr-xwqflask/wqflask/interval_analyst/IntervalAnalystPage.py138
-rwxr-xr-xwqflask/wqflask/marker_regression/MarkerRegressionPage.py10
-rw-r--r--wqflask/wqflask/marker_regression/gemma_mapping.py13
-rw-r--r--[-rwxr-xr-x]wqflask/wqflask/marker_regression/marker_regression.py398
-rw-r--r--wqflask/wqflask/marker_regression/marker_regression_gn1.py1246
-rw-r--r--[-rwxr-xr-x]wqflask/wqflask/model.py0
-rw-r--r--[-rwxr-xr-x]wqflask/wqflask/search_results.py143
-rwxr-xr-xwqflask/wqflask/show_trait/export_trait_data.py17
-rw-r--r--[-rwxr-xr-x]wqflask/wqflask/show_trait/show_trait.py48
l---------wqflask/wqflask/static/css1
-rw-r--r--wqflask/wqflask/static/dbdoc/TODO.md1
l---------wqflask/wqflask/static/images1
l---------wqflask/wqflask/static/javascript1
-rwxr-xr-xwqflask/wqflask/static/new/css/corr_matrix.css2
-rw-r--r--wqflask/wqflask/static/new/javascript/create_lodchart.coffee4
-rw-r--r--wqflask/wqflask/static/new/javascript/create_lodchart.js87
-rwxr-xr-xwqflask/wqflask/static/new/javascript/dataset_menu_structure.json322
-rw-r--r--wqflask/wqflask/static/new/javascript/draw_probability_plot.js7
-rw-r--r--[-rwxr-xr-x]wqflask/wqflask/static/new/javascript/show_trait.js44
-rwxr-xr-xwqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js23
-rwxr-xr-xwqflask/wqflask/static/new/packages/DataTables/css/jquery.dataTables.css4
-rwxr-xr-xwqflask/wqflask/static/new/packages/DataTables/js/dataTables.naturalSort.js122
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/additional-methods.js998
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/additional-methods.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/jquery.validate.js1398
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/jquery.validate.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ar.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ar.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bg.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bg.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bn_BD.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bn_BD.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ca.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ca.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_cs.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_cs.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_da.js30
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_da.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_de.js30
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_de.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_el.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_el.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es.js36
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_AR.js37
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_AR.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_PE.js37
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_PE.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_et.js31
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_et.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_eu.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_eu.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fa.js36
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fa.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fi.js31
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fi.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fr.js59
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fr.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ge.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ge.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_gl.js38
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_gl.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_he.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_he.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hr.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hr.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hu.js32
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hu.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hy_AM.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hy_AM.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_id.js32
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_id.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_is.js31
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_is.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_it.js37
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_it.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ja.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ja.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ka.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ka.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_kk.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_kk.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ko.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ko.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lt.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lt.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lv.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lv.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_my.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_my.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_nl.js43
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_nl.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_no.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_no.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pl.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pl.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_BR.js39
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_BR.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_PT.js37
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_PT.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ro.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ro.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ru.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ru.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_si.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_si.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sk.js30
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sk.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sl.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sl.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr_lat.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr_lat.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sv.js31
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sv.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_th.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_th.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tj.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tj.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tr.js34
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tr.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_uk.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_uk.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_vi.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_vi.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh.js33
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh_TW.js34
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh_TW.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_de.js22
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_de.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_es_CL.js22
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_es_CL.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_fi.js22
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_fi.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_nl.js19
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_nl.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_pt.js19
-rw-r--r--wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_pt.min.js4
-rw-r--r--wqflask/wqflask/static/new/packages/nvd3/nv.d3.css2
-rw-r--r--wqflask/wqflask/static/new/packages/nvd3/nv.d3.js5
-rw-r--r--wqflask/wqflask/static/output/Itvl_3kiKQR1g.jpegbin0 -> 100480 bytes
-rw-r--r--wqflask/wqflask/static/output/Itvl_hNsk2rxO.jpegbin0 -> 100480 bytes
-rwxr-xr-xwqflask/wqflask/static/packages/bootstrap/css/docs.css4
-rwxr-xr-xwqflask/wqflask/templates/base.html4
-rwxr-xr-xwqflask/wqflask/templates/collections/list.html15
-rwxr-xr-xwqflask/wqflask/templates/collections/view.html66
-rwxr-xr-xwqflask/wqflask/templates/correlation_page.html252
-rw-r--r--wqflask/wqflask/templates/ctl_results.html47
-rw-r--r--wqflask/wqflask/templates/ctl_setup.html65
-rwxr-xr-xwqflask/wqflask/templates/gsearch_gene.html175
-rwxr-xr-xwqflask/wqflask/templates/gsearch_pheno.html101
-rwxr-xr-xwqflask/wqflask/templates/index_page.html8
-rw-r--r--wqflask/wqflask/templates/marker_regression_gn1.html331
-rw-r--r--wqflask/wqflask/templates/pair_scan_results.html2
-rwxr-xr-xwqflask/wqflask/templates/search_result_page.html100
-rwxr-xr-xwqflask/wqflask/templates/show_trait.html91
-rwxr-xr-xwqflask/wqflask/templates/show_trait_calculate_correlations.html29
-rwxr-xr-xwqflask/wqflask/templates/show_trait_details.html144
-rwxr-xr-xwqflask/wqflask/templates/show_trait_edit_data.html19
-rwxr-xr-xwqflask/wqflask/templates/show_trait_mapping_tools.html178
-rwxr-xr-xwqflask/wqflask/templates/show_trait_statistics.html7
-rw-r--r--wqflask/wqflask/templates/wgcna_setup.html18
-rw-r--r--wqflask/wqflask/update_search_results.py129
-rwxr-xr-xwqflask/wqflask/user_manager.py4
-rw-r--r--[-rwxr-xr-x]wqflask/wqflask/views.py158
-rw-r--r--wqflask/wqflask/wgcna/wgcna_analysis.py8
194 files changed, 4310 insertions, 7379 deletions
diff --git a/wqflask/base/GeneralObject.py b/wqflask/base/GeneralObject.py
new file mode 100644
index 00000000..02a1ef06
--- /dev/null
+++ b/wqflask/base/GeneralObject.py
@@ -0,0 +1,68 @@
+# Copyright (C) University of Tennessee Health Science Center, Memphis, TN.
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Affero General Public License
+# as published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Affero General Public License for more details.
+#
+# This program is available from Source Forge: at GeneNetwork Project
+# (sourceforge.net/projects/genenetwork/).
+#
+# Contact Drs. Robert W. Williams and Xiaodong Zhou (2010)
+# at rwilliams@uthsc.edu and xzhou15@uthsc.edu
+#
+#
+#
+# This module is used by GeneNetwork project (www.genenetwork.org)
+#
+# Created by GeneNetwork Core Team 2010/08/10
+#
+# Last updated by GeneNetwork Core Team 2010/10/20
+
+class GeneralObject:
+ """
+ Base class to define an Object.
+ a = [Spam(1, 4), Spam(9, 3), Spam(4,6)]
+ a.sort(lambda x, y: cmp(x.eggs, y.eggs))
+ """
+
+ def __init__(self, *args, **kw):
+ self.contents = list(args)
+ for name, value in kw.items():
+ setattr(self, name, value)
+
+ def __setitem__(self, key, value):
+ setattr(self, key, value)
+
+ def __getitem__(self, key):
+ return getattr(self, key)
+
+ def __getattr__(self, key):
+ if key in self.__dict__.keys():
+ return self.__dict__[key]
+ else:
+ return eval("self.__dict__.%s" % key)
+
+ def __len__(self):
+ return len(self.__dict__) - 1
+
+ def __str__(self):
+ s = ''
+ for key in self.__dict__.keys():
+ if key != 'contents':
+ s += '%s = %s\n' % (key,self.__dict__[key])
+ return s
+
+ def __repr__(self):
+ s = ''
+ for key in self.__dict__.keys():
+ s += '%s = %s\n' % (key,self.__dict__[key])
+ return s
+
+ def __cmp__(self,other):
+ return len(self.__dict__.keys()).__cmp__(len(other.__dict__.keys())) \ No newline at end of file
diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py
index 68a2a185..4953e728 100755..100644
--- a/wqflask/base/data_set.py
+++ b/wqflask/base/data_set.py
@@ -44,6 +44,7 @@ from dbFunction import webqtlDatabaseFunction
from utility import webqtlUtil
from utility.benchmark import Bench
from utility import chunks
+from utility.tools import locate, locate_ignore_error
from maintenance import get_group_samplelists
@@ -54,43 +55,29 @@ from pprint import pformat as pf
# Each subclass will add to this
DS_NAME_MAP = {}
-def create_dataset(dataset_name, dataset_type = None):
+def create_dataset(dataset_name, dataset_type = None, get_samplelist = True):
if not dataset_type:
dataset_type = Dataset_Getter(dataset_name)
- #dataset_type = get_dataset_type_from_json(dataset_name)
print("dataset_type is:", dataset_type)
- #query = """
- # SELECT DBType.Name
- # FROM DBList, DBType
- # WHERE DBList.Name = '{}' and
- # DBType.Id = DBList.DBTypeId
- # """.format(escape(dataset_name))
- #dataset_type = g.db.execute(query).fetchone().Name
-
dataset_ob = DS_NAME_MAP[dataset_type]
dataset_class = globals()[dataset_ob]
- return dataset_class(dataset_name)
-
+ return dataset_class(dataset_name, get_samplelist)
-#def get_dataset_type_from_json(dataset_name):
-
class Dataset_Types(object):
-
+
def __init__(self):
self.datasets = {}
file_name = "wqflask/static/new/javascript/dataset_menu_structure.json"
with open(file_name, 'r') as fh:
data = json.load(fh)
-
+
print("*" * 70)
for species in data['datasets']:
for group in data['datasets'][species]:
for dataset_type in data['datasets'][species][group]:
for dataset in data['datasets'][species][group][dataset_type]:
- #print("dataset is:", dataset)
-
short_dataset_name = dataset[1]
if dataset_type == "Phenotypes":
new_type = "Publish"
@@ -99,32 +86,28 @@ class Dataset_Types(object):
else:
new_type = "ProbeSet"
self.datasets[short_dataset_name] = new_type
-
+
def __call__(self, name):
return self.datasets[name]
-
+
# Do the intensive work at startup one time only
Dataset_Getter = Dataset_Types()
-#
-#print("Running at startup:", get_dataset_type_from_json("HBTRC-MLPFC_0611"))
-
-
def create_datasets_list():
key = "all_datasets"
result = Redis.get(key)
-
+
if result:
print("Cache hit!!!")
datasets = pickle.loads(result)
-
+
else:
datasets = list()
with Bench("Creating DataSets object"):
type_dict = {'Publish': 'PublishFreeze',
'ProbeSet': 'ProbeSetFreeze',
'Geno': 'GenoFreeze'}
-
+
for dataset_type in type_dict:
query = "SELECT Name FROM {}".format(type_dict[dataset_type])
for result in g.db.execute(query).fetchall():
@@ -133,10 +116,10 @@ def create_datasets_list():
#print("type: {}\tname: {}".format(dataset_type, result.Name))
dataset = create_dataset(result.Name, dataset_type)
datasets.append(dataset)
-
+
Redis.set(key, pickle.dumps(datasets, pickle.HIGHEST_PROTOCOL))
Redis.expire(key, 60*60)
-
+
return datasets
@@ -157,31 +140,30 @@ def mescape(*items):
class Markers(object):
"""Todo: Build in cacheing so it saves us reading the same file more than once"""
def __init__(self, name):
- json_data_fh = open(os.path.join(webqtlConfig.NEWGENODIR + name + '.json'))
+ json_data_fh = open(locate(name + '.json','genotype/json'))
try:
markers = json.load(json_data_fh)
except:
markers = []
-
+
for marker in markers:
if (marker['chr'] != "X") and (marker['chr'] != "Y"):
marker['chr'] = int(marker['chr'])
- print("Mb:", marker['Mb'])
marker['Mb'] = float(marker['Mb'])
-
+
self.markers = markers
#print("self.markers:", self.markers)
-
-
+
+
def add_pvalues(self, p_values):
print("length of self.markers:", len(self.markers))
print("length of p_values:", len(p_values))
-
+
if type(p_values) is list:
# THIS IS only needed for the case when we are limiting the number of p-values calculated
#if len(self.markers) > len(p_values):
# self.markers = self.markers[:len(p_values)]
-
+
for marker, p_value in itertools.izip(self.markers, p_values):
if not p_value:
continue
@@ -214,18 +196,11 @@ class Markers(object):
#self.markers.remove(marker)
#del self.markers[i]
self.markers = filtered_markers
-
-
- #for i, marker in enumerate(self.markers):
- # if not 'p_value' in marker:
- # #print("self.markers[i]", self.markers[i])
- # del self.markers[i]
- # #self.markers.remove(self.markers[i])
class HumanMarkers(Markers):
-
+
def __init__(self, name, specified_markers = []):
- marker_data_fh = open(os.path.join(webqtlConfig.PYLMM_PATH + name + '.bim'))
+ marker_data_fh = open(locate('genotype') + '/' + name + '.bim')
self.markers = []
for line in marker_data_fh:
splat = line.strip().split()
@@ -244,54 +219,36 @@ class HumanMarkers(Markers):
marker['name'] = splat[1]
marker['Mb'] = float(splat[3]) / 1000000
self.markers.append(marker)
-
+
#print("markers is: ", pf(self.markers))
def add_pvalues(self, p_values):
- #for marker, p_value in itertools.izip(self.markers, p_values):
- # if marker['Mb'] <= 0 and marker['chr'] == 0:
- # continue
- # marker['p_value'] = p_value
- # print("p_value is:", marker['p_value'])
- # marker['lod_score'] = -math.log10(marker['p_value'])
- # #Using -log(p) for the LRS; need to ask Rob how he wants to get LRS from p-values
- # marker['lrs_value'] = -math.log10(marker['p_value']) * 4.61
-
- #print("p_values2:", pf(p_values))
super(HumanMarkers, self).add_pvalues(p_values)
-
- #with Bench("deleting markers"):
- # markers = []
- # for marker in self.markers:
- # if not marker['Mb'] <= 0 and not marker['chr'] == 0:
- # markers.append(marker)
- # self.markers = markers
-
-
+
class DatasetGroup(object):
"""
Each group has multiple datasets; each species has multiple groups.
-
+
For example, Mouse has multiple groups (BXD, BXA, etc), and each group
has multiple datasets associated with it.
-
+
"""
def __init__(self, dataset):
"""This sets self.group and self.group_id"""
- print("DATASET NAME2:", dataset.name)
+ #print("DATASET NAME2:", dataset.name)
self.name, self.id = g.db.execute(dataset.query_for_group).fetchone()
if self.name == 'BXD300':
self.name = "BXD"
-
+
self.f1list = None
self.parlist = None
self.get_f1_parent_strains()
#print("parents/f1s: {}:{}".format(self.parlist, self.f1list))
-
+
self.species = webqtlDatabaseFunction.retrieve_species(self.name)
-
+
self.incparentsf1 = False
self.allsamples = None
self._datasets = None
@@ -302,7 +259,7 @@ class DatasetGroup(object):
def get_markers(self):
#print("self.species is:", self.species)
if self.species == "human":
- marker_class = HumanMarkers
+ marker_class = HumanMarkers
else:
marker_class = Markers
@@ -311,12 +268,6 @@ class DatasetGroup(object):
def datasets(self):
key = "group_dataset_menu:v2:" + self.name
print("key is2:", key)
- #with Bench("Loading cache"):
- # result = Redis.get(key)
- #if result:
- # self._datasets = pickle.loads(result)
- # return self._datasets
-
dataset_menu = []
print("[tape4] webqtlConfig.PUBLICTHRESH:", webqtlConfig.PUBLICTHRESH)
print("[tape4] type webqtlConfig.PUBLICTHRESH:", type(webqtlConfig.PUBLICTHRESH))
@@ -356,7 +307,7 @@ class DatasetGroup(object):
dataset_menu.append(dict(tissue=None, datasets=[(dataset, dataset_short)]))
else:
dataset_sub_menu = [item[1:] for item in dataset]
-
+
tissue_already_exists = False
tissue_position = None
for i, tissue_dict in enumerate(dataset_menu):
@@ -366,7 +317,7 @@ class DatasetGroup(object):
break
if tissue_already_exists:
- print("dataset_menu:", dataset_menu[i]['datasets'])
+ #print("dataset_menu:", dataset_menu[i]['datasets'])
dataset_menu[i]['datasets'].append((dataset, dataset_short))
else:
dataset_menu.append(dict(tissue=tissue_name,
@@ -384,7 +335,7 @@ class DatasetGroup(object):
f1, f12, maternal, paternal = webqtlUtil.ParInfo[self.name]
except KeyError:
f1 = f12 = maternal = paternal = None
-
+
if f1 and f12:
self.f1list = [f1, f12]
if maternal and paternal:
@@ -392,32 +343,28 @@ class DatasetGroup(object):
def get_samplelist(self):
key = "samplelist:v2:" + self.name
- print("key is:", key)
- with Bench("Loading cache"):
- result = Redis.get(key)
+ #print("key is:", key)
+ #with Bench("Loading cache"):
+ result = Redis.get(key)
if result:
- print("Sample List Cache hit!!!")
- print("Before unjsonifying {}: {}".format(type(result), result))
+ #print("Sample List Cache hit!!!")
+ #print("Before unjsonifying {}: {}".format(type(result), result))
self.samplelist = json.loads(result)
- print(" type: ", type(self.samplelist))
- print(" self.samplelist: ", self.samplelist)
+ #print(" type: ", type(self.samplelist))
+ #print(" self.samplelist: ", self.samplelist)
else:
print("Cache not hit")
- from utility.tools import plink_command
- PLINK_PATH,PLINK_COMMAND = plink_command()
-
- geno_file_path = webqtlConfig.GENODIR+self.name+".geno"
- plink_file_path = PLINK_PATH+"/"+self.name+".fam"
-
- if os.path.isfile(plink_file_path):
- self.samplelist = get_group_samplelists.get_samplelist("plink", plink_file_path)
- elif os.path.isfile(geno_file_path):
- self.samplelist = get_group_samplelists.get_samplelist("geno", geno_file_path)
+ genotype_fn = locate_ignore_error(self.name+".geno",'genotype')
+ mapping_fn = locate_ignore_error(self.name+".fam",'mapping')
+ if mapping_fn:
+ self.samplelist = get_group_samplelists.get_samplelist("plink", mapping_fn)
+ elif genotype_fn:
+ self.samplelist = get_group_samplelists.get_samplelist("geno", genotype_fn)
else:
self.samplelist = None
- print("after get_samplelist")
+ print("Sample list: ",self.samplelist)
Redis.set(key, json.dumps(self.samplelist))
Redis.expire(key, 60*5)
@@ -429,30 +376,14 @@ class DatasetGroup(object):
def read_genotype_file(self):
'''Read genotype from .geno file instead of database'''
- #if self.group == 'BXD300':
- # self.group = 'BXD'
- #
- #assert self.group, "self.group needs to be set"
-
#genotype_1 is Dataset Object without parents and f1
#genotype_2 is Dataset Object with parents and f1 (not for intercross)
genotype_1 = reaper.Dataset()
# reaper barfs on unicode filenames, so here we ensure it's a string
- full_filename = str(os.path.join(webqtlConfig.GENODIR, self.name + '.geno'))
- if os.path.isfile(full_filename):
- print("Reading file: ", full_filename)
- genotype_1.read(full_filename)
- print("File read")
- else:
- try:
- full_filename = str(os.path.join(webqtlConfig.TMPDIR, self.name + '.geno'))
- #print("Reading file")
- genotype_1.read(full_filename)
- #print("File read")
- except IOError:
- print("File doesn't exist!")
+ full_filename = str(locate(self.name+'.geno','genotype'))
+ genotype_1.read(full_filename)
if genotype_1.type == "group" and self.parlist:
genotype_2 = genotype_1.add(Mat=self.parlist[0], Pat=self.parlist[1]) #, F1=_f1)
@@ -461,39 +392,15 @@ class DatasetGroup(object):
#determine default genotype object
if self.incparentsf1 and genotype_1.type != "intercross":
- #self.genotype = genotype_2
genotype = genotype_2
else:
self.incparentsf1 = 0
- #self.genotype = genotype_1
genotype = genotype_1
- #self.samplelist = list(self.genotype.prgy)
self.samplelist = list(genotype.prgy)
-
- return genotype
-
-#class DataSets(object):
-# """Builds a list of DataSets"""
-#
-# def __init__(self):
-# self.datasets = list()
-#
-
-
- #query = """SELECT Name FROM ProbeSetFreeze
- # UNION
- # SELECT Name From PublishFreeze
- # UNION
- # SELECT Name From GenoFreeze"""
- #
- #for result in g.db.execute(query).fetchall():
- # dataset = DataSet(result.Name)
- # self.datasets.append(dataset)
+ return genotype
-#ds = DataSets()
-#print("[orange] ds:", ds.datasets)
class DataSet(object):
"""
@@ -502,7 +409,7 @@ class DataSet(object):
"""
- def __init__(self, name):
+ def __init__(self, name, get_samplelist = True):
assert name, "Need a name"
self.name = name
@@ -510,49 +417,28 @@ class DataSet(object):
self.shortname = None
self.fullname = None
self.type = None
+ self.data_scale = None #ZS: For example log2
self.setup()
self.check_confidentiality()
self.retrieve_other_names()
-
+
self.group = DatasetGroup(self) # sets self.group and self.group_id and gets genotype
- self.group.get_samplelist()
+ if get_samplelist == True:
+ self.group.get_samplelist()
self.species = species.TheSpecies(self)
- print("TESTING!!!")
-
def get_desc(self):
"""Gets overridden later, at least for Temp...used by trait's get_given_name"""
return None
-
- #@staticmethod
- #def get_by_trait_id(trait_id):
- # """Gets the dataset object given the trait id"""
- #
- #
- #
- # name = g.db.execute(""" SELECT
- #
- # """)
- #
- # return DataSet(name)
# Delete this eventually
@property
def riset():
Weve_Renamed_This_As_Group
-
-
- #@property
- #def group(self):
- # if not self._group:
- # self.get_group()
- #
- # return self._group
-
def retrieve_other_names(self):
"""
@@ -562,7 +448,7 @@ class DataSet(object):
This is not meant to retrieve the data set info if no name at all is passed.
"""
-
+
try:
if self.type == "ProbeSet":
query_args = tuple(escape(x) for x in (
@@ -571,8 +457,8 @@ class DataSet(object):
self.name,
self.name))
- self.id, self.name, self.fullname, self.shortname, self.tissue = g.db.execute("""
- SELECT ProbeSetFreeze.Id, ProbeSetFreeze.Name, ProbeSetFreeze.FullName, ProbeSetFreeze.ShortName, Tissue.Name
+ self.id, self.name, self.fullname, self.shortname, self.data_scale, self.tissue = g.db.execute("""
+ SELECT ProbeSetFreeze.Id, ProbeSetFreeze.Name, ProbeSetFreeze.FullName, ProbeSetFreeze.ShortName, ProbeSetFreeze.DataScale, Tissue.Name
FROM ProbeSetFreeze, ProbeFreeze, Tissue
WHERE ProbeSetFreeze.public > %s AND
ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id AND
@@ -598,17 +484,17 @@ class DataSet(object):
except TypeError:
print("Dataset {} is not yet available in GeneNetwork.".format(self.name))
pass
-
+
def get_trait_data(self, sample_list=None):
if sample_list:
self.samplelist = sample_list
else:
self.samplelist = self.group.samplelist
-
+
if self.group.parlist != None and self.group.f1list != None:
if (self.group.parlist + self.group.f1list) in self.samplelist:
self.samplelist += self.group.parlist + self.group.f1list
-
+
query = """
SELECT Strain.Name, Strain.Id FROM Strain, Species
WHERE Strain.Name IN {}
@@ -625,21 +511,6 @@ class DataSet(object):
number_chunks = int(math.ceil(len(sample_ids) / chunk_size))
trait_sample_data = []
for sample_ids_step in chunks.divide_into_chunks(sample_ids, number_chunks):
-
- #XZ, 09/24/2008: build one temporary table that only contains the records associated with the input GeneId
- #tempTable = None
- #if GeneId and db.type == "ProbeSet":
- # if method == "3":
- # tempTable = self.getTempLiteratureTable(species=species,
- # input_species_geneid=GeneId,
- # returnNumber=returnNumber)
- #
- # if method == "4" or method == "5":
- # tempTable = self.getTempTissueCorrTable(primaryTraitSymbol=GeneSymbol,
- # TissueProbeSetFreezeId=tissueProbeSetFreezeId,
- # method=method,
- # returnNumber=returnNumber)
-
if self.type == "Publish":
dataset_type = "Phenotype"
else:
@@ -660,7 +531,7 @@ class DataSet(object):
left join {}Data as T{} on T{}.Id = {}XRef.DataId
and T{}.StrainId={}\n
""".format(*mescape(self.type, item, item, self.type, item, item))
-
+
if self.type == "Publish":
query += """
WHERE {}XRef.InbredSetId = {}Freeze.InbredSetId
@@ -677,16 +548,16 @@ class DataSet(object):
order by {}.Id
""".format(*mescape(self.type, self.type, self.type, self.type,
self.name, dataset_type, self.type, self.type, dataset_type))
-
+
#print("trait data query: ", query)
-
+
results = g.db.execute(query).fetchall()
#print("query results:", results)
trait_sample_data.append(results)
trait_count = len(trait_sample_data[0])
self.trait_data = collections.defaultdict(list)
-
+
# put all of the separate data together into a dictionary where the keys are
# trait names and values are lists of sample values
for trait_counter in range(trait_count):
@@ -699,9 +570,9 @@ class PhenotypeDataSet(DataSet):
DS_NAME_MAP['Publish'] = 'PhenotypeDataSet'
def setup(self):
-
- print("IS A PHENOTYPEDATASET")
-
+
+ #print("IS A PHENOTYPEDATASET")
+
# Fields in the database table
self.search_fields = ['Phenotype.Post_publication_description',
'Phenotype.Pre_publication_description',
@@ -772,26 +643,26 @@ class PhenotypeDataSet(DataSet):
def get_trait_info(self, trait_list, species = ''):
for this_trait in trait_list:
-
+
if not this_trait.haveinfo:
this_trait.retrieve_info(get_qtl_info=True)
description = this_trait.post_publication_description
-
+
#If the dataset is confidential and the user has access to confidential
#phenotype traits, then display the pre-publication description instead
#of the post-publication description
if this_trait.confidential:
this_trait.description_display = ""
continue # for now
-
+
if not webqtlUtil.hasAccessToConfidentialPhenotypeTrait(
privilege=self.privilege,
userName=self.userName,
authorized_users=this_trait.authorized_users):
-
+
description = this_trait.pre_publication_description
-
+
if len(description) > 0:
this_trait.description_display = description.strip()
else:
@@ -836,11 +707,11 @@ class PhenotypeDataSet(DataSet):
this_trait.LRS_score_repr = LRS_score_repr = '%3.1f' % this_trait.lrs
this_trait.LRS_score_value = LRS_score_value = this_trait.lrs
this_trait.LRS_location_repr = LRS_location_repr = 'Chr%s: %.6f' % (LRS_Chr, float(LRS_Mb))
-
+
def retrieve_sample_data(self, trait):
query = """
SELECT
- Strain.Name, PublishData.value, PublishSE.error, NStrain.count
+ Strain.Name, PublishData.value, PublishSE.error, NStrain.count, Strain.Name2
FROM
(PublishData, Strain, PublishXRef, PublishFreeze)
left join PublishSE on
@@ -894,7 +765,7 @@ class GenotypeDataSet(DataSet):
def check_confidentiality(self):
return geno_mrna_confidentiality(self)
-
+
def get_trait_list(self):
query = """
select Geno.Name
@@ -928,11 +799,11 @@ class GenotypeDataSet(DataSet):
this_trait.location_repr = 'Chr%s: %.6f' % (this_trait.chr, float(this_trait.mb) )
this_trait.location_value = trait_location_value
-
+
def retrieve_sample_data(self, trait):
query = """
SELECT
- Strain.Name, GenoData.value, GenoSE.error, GenoData.Id
+ Strain.Name, GenoData.value, GenoSE.error, GenoData.Id, Sample.Name2
FROM
(GenoData, GenoFreeze, Strain, Geno, GenoXRef)
left join GenoSE on
@@ -1020,7 +891,7 @@ class MrnaAssayDataSet(DataSet):
def check_confidentiality(self):
return geno_mrna_confidentiality(self)
-
+
def get_trait_list_1(self):
query = """
select ProbeSet.Name
@@ -1029,86 +900,14 @@ class MrnaAssayDataSet(DataSet):
and ProbeSetFreezeId = {}
""".format(escape(str(self.id)))
results = g.db.execute(query).fetchall()
- #print("After get_trait_list query")
trait_data = {}
for trait in results:
- print("Retrieving sample_data for ", trait[0])
trait_data[trait[0]] = self.retrieve_sample_data(trait[0])
- #print("After retrieve_sample_data")
return trait_data
-
- #def get_trait_data(self):
- # self.samplelist = self.group.samplelist + self.group.parlist + self.group.f1list
- # query = """
- # SELECT Strain.Name, Strain.Id FROM Strain, Species
- # WHERE Strain.Name IN {}
- # and Strain.SpeciesId=Species.Id
- # and Species.name = '{}'
- # """.format(create_in_clause(self.samplelist), *mescape(self.group.species))
- # results = dict(g.db.execute(query).fetchall())
- # sample_ids = [results[item] for item in self.samplelist]
- #
- # # MySQL limits the number of tables that can be used in a join to 61,
- # # so we break the sample ids into smaller chunks
- # # Postgres doesn't have that limit, so we can get rid of this after we transition
- # chunk_size = 50
- # number_chunks = int(math.ceil(len(sample_ids) / chunk_size))
- # trait_sample_data = []
- # for sample_ids_step in chunks.divide_into_chunks(sample_ids, number_chunks):
- #
- # #XZ, 09/24/2008: build one temporary table that only contains the records associated with the input GeneId
- # #tempTable = None
- # #if GeneId and db.type == "ProbeSet":
- # # if method == "3":
- # # tempTable = self.getTempLiteratureTable(species=species,
- # # input_species_geneid=GeneId,
- # # returnNumber=returnNumber)
- # #
- # # if method == "4" or method == "5":
- # # tempTable = self.getTempTissueCorrTable(primaryTraitSymbol=GeneSymbol,
- # # TissueProbeSetFreezeId=tissueProbeSetFreezeId,
- # # method=method,
- # # returnNumber=returnNumber)
- #
- # temp = ['T%s.value' % item for item in sample_ids_step]
- # query = "SELECT {}.Name,".format(escape(self.type))
- # data_start_pos = 1
- # query += string.join(temp, ', ')
- # query += ' FROM ({}, {}XRef, {}Freeze) '.format(*mescape(self.type,
- # self.type,
- # self.type))
- #
- # for item in sample_ids_step:
- # query += """
- # left join {}Data as T{} on T{}.Id = {}XRef.DataId
- # and T{}.StrainId={}\n
- # """.format(*mescape(self.type, item, item, self.type, item, item))
- #
- # query += """
- # WHERE {}XRef.{}FreezeId = {}Freeze.Id
- # and {}Freeze.Name = '{}'
- # and {}.Id = {}XRef.{}Id
- # order by {}.Id
- # """.format(*mescape(self.type, self.type, self.type, self.type,
- # self.name, self.type, self.type, self.type, self.type))
- # results = g.db.execute(query).fetchall()
- # trait_sample_data.append(results)
- #
- # trait_count = len(trait_sample_data[0])
- # self.trait_data = collections.defaultdict(list)
- #
- # # put all of the separate data together into a dictionary where the keys are
- # # trait names and values are lists of sample values
- # for trait_counter in range(trait_count):
- # trait_name = trait_sample_data[0][trait_counter][0]
- # for chunk_counter in range(int(number_chunks)):
- # self.trait_data[trait_name] += (
- # trait_sample_data[chunk_counter][trait_counter][data_start_pos:])
-
def get_trait_info(self, trait_list=None, species=''):
- # Note: setting trait_list to [] is probably not a great idea.
+ # Note: setting trait_list to [] is probably not a great idea.
if not trait_list:
trait_list = []
@@ -1171,7 +970,7 @@ class MrnaAssayDataSet(DataSet):
#print("query is:", pf(query))
result = g.db.execute(query).fetchone()
-
+
mean = result[0] if result else 0
if mean:
@@ -1192,28 +991,15 @@ class MrnaAssayDataSet(DataSet):
Geno.SpeciesId = Species.Id
""".format(species, this_trait.locus)
result = g.db.execute(query).fetchone()
-
+
if result:
- #if result[0] and result[1]:
- # lrs_chr = result[0]
- # lrs_mb = result[1]
lrs_chr, lrs_mb = result
#XZ: LRS_location_value is used for sorting
lrs_location_value = self.convert_location_to_value(lrs_chr, lrs_mb)
-
- #try:
- # lrs_location_value = int(lrs_chr)*1000 + float(lrs_mb)
- #except:
- # if lrs_chr.upper() == 'X':
- # lrs_location_value = 20*1000 + float(lrs_mb)
- # else:
- # lrs_location_value = (ord(str(LRS_chr).upper()[0])*1000 +
- # float(lrs_mb))
-
this_trait.LRS_score_repr = '%3.1f' % this_trait.lrs
this_trait.LRS_score_value = this_trait.lrs
this_trait.LRS_location_repr = 'Chr%s: %.6f' % (lrs_chr, float(lrs_mb))
-
+
def convert_location_to_value(self, chromosome, mb):
try:
@@ -1224,7 +1010,7 @@ class MrnaAssayDataSet(DataSet):
else:
location_value = (ord(str(chromosome).upper()[0])*1000 +
float(mb))
-
+
return location_value
def get_sequence(self):
@@ -1241,11 +1027,11 @@ class MrnaAssayDataSet(DataSet):
""" % (escape(self.name), escape(self.dataset.name))
results = g.db.execute(query).fetchone()
return results[0]
-
+
def retrieve_sample_data(self, trait):
query = """
SELECT
- Strain.Name, ProbeSetData.value, ProbeSetSE.error, ProbeSetData.Id
+ Strain.Name, ProbeSetData.value, ProbeSetSE.error, ProbeSetData.Id, Strain.Name2
FROM
(ProbeSetData, ProbeSetFreeze, Strain, ProbeSet, ProbeSetXRef)
left join ProbeSetSE on
@@ -1262,8 +1048,8 @@ class MrnaAssayDataSet(DataSet):
results = g.db.execute(query).fetchall()
#print("RETRIEVED RESULTS HERE:", results)
return results
-
-
+
+
def retrieve_genes(self, column_name):
query = """
select ProbeSet.Name, ProbeSet.%s
@@ -1272,37 +1058,8 @@ class MrnaAssayDataSet(DataSet):
ProbeSetXRef.ProbeSetId=ProbeSet.Id;
""" % (column_name, escape(str(self.id)))
results = g.db.execute(query).fetchall()
-
- return dict(results)
- #def retrieve_gene_symbols(self):
- # query = """
- # select ProbeSet.Name, ProbeSet.Symbol, ProbeSet.GeneId
- # from ProbeSet,ProbeSetXRef
- # where ProbeSetXRef.ProbeSetFreezeId = %s and
- # ProbeSetXRef.ProbeSetId=ProbeSet.Id;
- # """ % (self.id)
- # results = g.db.execute(query).fetchall()
- # symbol_dict = {}
- # for item in results:
- # symbol_dict[item[0]] = item[1]
- # return symbol_dict
- #
- #def retrieve_gene_ids(self):
- # query = """
- # select ProbeSet.Name, ProbeSet.GeneId
- # from ProbeSet,ProbeSetXRef
- # where ProbeSetXRef.ProbeSetFreezeId = %s and
- # ProbeSetXRef.ProbeSetId=ProbeSet.Id;
- # """ % (self.id)
- # return process_and_run_query(query)
- # results = g.db.execute(query).fetchall()
- # symbol_dict = {}
- # for item in results:
- # symbol_dict[item[0]] = item[1]
- # return symbol_dict
-
-
+ return dict(results)
class TempDataSet(DataSet):
@@ -1324,8 +1081,8 @@ class TempDataSet(DataSet):
self.id = 1
self.fullname = 'Temporary Storage'
self.shortname = 'Temp'
-
-
+
+
@staticmethod
def handle_pca(desc):
if 'PCA' in desc:
@@ -1334,13 +1091,13 @@ class TempDataSet(DataSet):
else:
desc = desc[:desc.index('entered')].strip()
return desc
-
+
def get_desc(self):
g.db.execute('SELECT description FROM Temp WHERE Name=%s', self.name)
desc = g.db.fetchone()[0]
desc = self.handle_pca(desc)
- return desc
-
+ return desc
+
def get_group(self):
self.cursor.execute("""
SELECT
@@ -1353,7 +1110,7 @@ class TempDataSet(DataSet):
""", self.name)
self.group, self.group_id = self.cursor.fetchone()
#return self.group
-
+
def retrieve_sample_data(self, trait):
query = """
SELECT
@@ -1367,7 +1124,7 @@ class TempDataSet(DataSet):
Order BY
Strain.Name
""" % escape(trait.name)
-
+
results = g.db.execute(query).fetchall()
diff --git a/wqflask/base/trait.py b/wqflask/base/trait.py
index ff80795c..a71d8157 100755..100644
--- a/wqflask/base/trait.py
+++ b/wqflask/base/trait.py
@@ -2,7 +2,7 @@ from __future__ import absolute_import, division, print_function
import string
import resource
-
+import codecs
from htmlgen import HTMLgen2 as HT
@@ -31,16 +31,16 @@ class GeneralTrait(object):
"""
- def __init__(self, get_qtl_info=False, **kw):
+ def __init__(self, get_qtl_info=False, get_sample_info=True, **kw):
# xor assertion
assert bool(kw.get('dataset')) != bool(kw.get('dataset_name')), "Needs dataset ob. or name";
if kw.get('dataset_name'):
self.dataset = create_dataset(kw.get('dataset_name'))
- print(" in GeneralTrait created dataset:", self.dataset)
+ #print(" in GeneralTrait created dataset:", self.dataset)
else:
self.dataset = kw.get('dataset')
self.name = kw.get('name') # Trait ID, ProbeSet ID, Published ID, etc.
- print("THE NAME IS:", self.name)
+ #print("THE NAME IS:", self.name)
self.cellid = kw.get('cellid')
self.identification = kw.get('identification', 'un-named trait')
self.haveinfo = kw.get('haveinfo', False)
@@ -67,7 +67,8 @@ class GeneralTrait(object):
# Todo: These two lines are necessary most of the time, but perhaps not all of the time
# So we could add a simple if statement to short-circuit this if necessary
self.retrieve_info(get_qtl_info=get_qtl_info)
- self.retrieve_sample_data()
+ if get_sample_info != False:
+ self.retrieve_sample_data()
def jsonable(self):
@@ -179,13 +180,15 @@ class GeneralTrait(object):
samples = []
vals = []
the_vars = []
+ sample_aliases = []
for sample_name, sample_data in self.data.items():
if sample_data.value != None:
if not include_variance or sample_data.variance != None:
samples.append(sample_name)
vals.append(sample_data.value)
the_vars.append(sample_data.variance)
- return samples, vals, the_vars
+ sample_aliases.append(sample_data.name2)
+ return samples, vals, the_vars, sample_aliases
#
@@ -220,32 +223,6 @@ class GeneralTrait(object):
if samplelist == None:
samplelist = []
- #assert self.dataset
-
- #if self.cellid:
- # #Probe Data
- # query = '''
- # SELECT
- # Strain.Name, ProbeData.value, ProbeSE.error, ProbeData.Id
- # FROM
- # (ProbeData, ProbeFreeze, ProbeSetFreeze, ProbeXRef,
- # Strain, Probe, ProbeSet)
- # left join ProbeSE on
- # (ProbeSE.DataId = ProbeData.Id AND ProbeSE.StrainId = ProbeData.StrainId)
- # WHERE
- # Probe.Name = '%s' AND ProbeSet.Name = '%s' AND
- # Probe.ProbeSetId = ProbeSet.Id AND
- # ProbeXRef.ProbeId = Probe.Id AND
- # ProbeXRef.ProbeFreezeId = ProbeFreeze.Id AND
- # ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id AND
- # ProbeSetFreeze.Name = '%s' AND
- # ProbeXRef.DataId = ProbeData.Id AND
- # ProbeData.StrainId = Strain.Id
- # Order BY
- # Strain.Name
- # ''' % (self.cellid, self.name, self.dataset.name)
- #
- #else:
results = self.dataset.retrieve_sample_data(self.name)
# Todo: is this necessary? If not remove
@@ -255,19 +232,10 @@ class GeneralTrait(object):
if results:
for item in results:
- name, value, variance, num_cases = item
+ name, value, variance, num_cases, name2 = item
if not samplelist or (samplelist and name in samplelist):
self.data[name] = webqtlCaseData(*item) #name, value, variance, num_cases)
- #def keys(self):
- # return self.__dict__.keys()
- #
- #def has_key(self, key):
- # return self.__dict__.has_key(key)
- #
- #def items(self):
- # return self.__dict__.items()
-
def retrieve_info(self, get_qtl_info=False):
assert self.dataset, "Dataset doesn't exist"
if self.dataset.type == 'Publish':
@@ -290,10 +258,10 @@ class GeneralTrait(object):
PublishXRef.InbredSetId = PublishFreeze.InbredSetId AND
PublishFreeze.Id = %s
""" % (self.name, self.dataset.id)
-
- print("query is:", query)
trait_info = g.db.execute(query).fetchone()
+
+
#XZ, 05/08/2009: Xiaodong add this block to use ProbeSet.Id to find the probeset instead of just using ProbeSet.Name
#XZ, 05/08/2009: to avoid the problem of same probeset name from different platforms.
elif self.dataset.type == 'ProbeSet':
@@ -328,7 +296,6 @@ class GeneralTrait(object):
escape(self.dataset.name),
escape(self.name))
trait_info = g.db.execute(query).fetchone()
- #print("trait_info is: ", pf(trait_info))
else: #Temp type
query = """SELECT %s FROM %s WHERE Name = %s"""
trait_info = g.db.execute(query,
@@ -339,54 +306,118 @@ class GeneralTrait(object):
#XZ: assign SQL query result to trait attributes.
for i, field in enumerate(self.dataset.display_fields):
- #print(" mike: {} -> {} - {}".format(field, type(trait_info[i]), trait_info[i]))
holder = trait_info[i]
if isinstance(trait_info[i], basestring):
holder = unicode(trait_info[i], "utf8", "ignore")
setattr(self, field, holder)
-
+
if self.dataset.type == 'Publish':
self.confidential = 0
if self.pre_publication_description and not self.pubmed_id:
self.confidential = 1
+
+ description = self.post_publication_description
+
+ #If the dataset is confidential and the user has access to confidential
+ #phenotype traits, then display the pre-publication description instead
+ #of the post-publication description
+ if self.confidential:
+ self.description_display = ""
+
+ #if not webqtlUtil.hasAccessToConfidentialPhenotypeTrait(
+ # privilege=self.dataset.privilege,
+ # userName=self.dataset.userName,
+ # authorized_users=self.authorized_users):
+ #
+ # description = self.pre_publication_description
+
+ if description:
+ self.description_display = description.strip()
+ else:
+ self.description_display = ""
- self.homologeneid = None
-
- #print("self.geneid is:", self.geneid)
- #print(" type:", type(self.geneid))
- #print("self.dataset.group.name is:", self.dataset.group.name)
- if self.dataset.type == 'ProbeSet' and self.dataset.group and self.geneid:
- #XZ, 05/26/2010: From time to time, this query get error message because some geneid values in database are not number.
- #XZ: So I have to test if geneid is number before execute the query.
- #XZ: The geneid values in database should be cleaned up.
- #try:
- # float(self.geneid)
- # geneidIsNumber = True
- #except ValueError:
- # geneidIsNumber = False
-
- #if geneidIsNumber:
-
-
- query = """
- SELECT
- HomologeneId
- FROM
- Homologene, Species, InbredSet
- WHERE
- Homologene.GeneId =%s AND
- InbredSet.Name = '%s' AND
- InbredSet.SpeciesId = Species.Id AND
- Species.TaxonomyId = Homologene.TaxonomyId
- """ % (escape(str(self.geneid)), escape(self.dataset.group.name))
- result = g.db.execute(query).fetchone()
- #else:
- # result = None
+ if not self.year.isdigit():
+ self.pubmed_text = "N/A"
+ else:
+ self.pubmed_text = self.year
- if result:
- self.homologeneid = result[0]
+ if self.pubmed_id:
+ self.pubmed_link = webqtlConfig.PUBMEDLINK_URL % self.pubmed_id
+
+
+ self.homologeneid = None
+ if self.dataset.type == 'ProbeSet' and self.dataset.group:
+ if self.geneid:
+ #XZ, 05/26/2010: From time to time, this query get error message because some geneid values in database are not number.
+ #XZ: So I have to test if geneid is number before execute the query.
+ #XZ: The geneid values in database should be cleaned up.
+ #try:
+ # float(self.geneid)
+ # geneidIsNumber = True
+ #except ValueError:
+ # geneidIsNumber = False
+ #if geneidIsNumber:
+ query = """
+ SELECT
+ HomologeneId
+ FROM
+ Homologene, Species, InbredSet
+ WHERE
+ Homologene.GeneId =%s AND
+ InbredSet.Name = '%s' AND
+ InbredSet.SpeciesId = Species.Id AND
+ Species.TaxonomyId = Homologene.TaxonomyId
+ """ % (escape(str(self.geneid)), escape(self.dataset.group.name))
+ result = g.db.execute(query).fetchone()
+ #else:
+ # result = None
+
+ if result:
+ self.homologeneid = result[0]
+
+ description_string = unicode(str(self.description).strip(codecs.BOM_UTF8), 'utf-8')
+ target_string = unicode(str(self.probe_target_description).strip(codecs.BOM_UTF8), 'utf-8')
+
+ if len(description_string) > 1 and description_string != 'None':
+ description_display = description_string
+ else:
+ description_display = self.symbol
+
+ if (len(description_display) > 1 and description_display != 'N/A' and
+ len(target_string) > 1 and target_string != 'None'):
+ description_display = description_display + '; ' + target_string.strip()
+
+ # Save it for the jinja2 template
+ self.description_display = description_display
+
+ #XZ: trait_location_value is used for sorting
+ trait_location_repr = 'N/A'
+ trait_location_value = 1000000
+
+ if self.chr and self.mb:
+ #Checks if the chromosome number can be cast to an int (i.e. isn't "X" or "Y")
+ #This is so we can convert the location to a number used for sorting
+ trait_location_value = convert_location_to_value(self.chr, self.mb)
+ #try:
+ # trait_location_value = int(self.chr)*1000 + self.mb
+ #except ValueError:
+ # if self.chr.upper() == 'X':
+ # trait_location_value = 20*1000 + self.mb
+ # else:
+ # trait_location_value = (ord(str(self.chr).upper()[0])*1000 +
+ # self.mb)
+
+ #ZS: Put this in function currently called "convert_location_to_value"
+ self.location_repr = 'Chr%s: %.6f' % (self.chr, float(self.mb))
+ self.location_value = trait_location_value
+
if get_qtl_info:
+ #LRS and its location
+ self.LRS_score_repr = "N/A"
+ self.LRS_score_value = 0
+ self.LRS_location_repr = "N/A"
+ self.LRS_location_value = 1000000
if self.dataset.type == 'ProbeSet' and not self.cellid:
query = """
SELECT
@@ -399,12 +430,8 @@ class GeneralTrait(object):
ProbeSetXRef.ProbeSetFreezeId ={}
""".format(self.name, self.dataset.id)
trait_qtl = g.db.execute(query).fetchone()
- #self.cursor.execute(query)
- #trait_qtl = self.cursor.fetchone()
if trait_qtl:
- print("trait_qtl:", trait_qtl)
self.locus, self.lrs, self.pvalue, self.mean, self.additive= trait_qtl
- print("self.locus:", self.locus)
if self.locus:
query = """
select Geno.Chr, Geno.Mb from Geno, Species
@@ -417,9 +444,9 @@ class GeneralTrait(object):
self.locus_chr = result[0]
self.locus_mb = result[1]
else:
- self.locus = self.locus_chr = self.locus_mb = ""
+ self.locus = self.locus_chr = self.locus_mb = self.additive = ""
else:
- self.locus = self.locus_chr = self.locus_mb = ""
+ self.locus = self.locus_chr = self.locus_mb = self.additive = ""
else:
self.locus = self.locus_chr = self.locus_mb = self.lrs = self.pvalue = self.mean = self.additive = ""
@@ -437,8 +464,38 @@ class GeneralTrait(object):
""", (self.name, self.dataset.id)).fetchone()
if trait_qtl:
self.locus, self.lrs, self.additive = trait_qtl
+ if self.locus:
+ query = """
+ select Geno.Chr, Geno.Mb from Geno, Species
+ where Species.Name = '{}' and
+ Geno.Name = '{}' and
+ Geno.SpeciesId = Species.Id
+ """.format(self.dataset.group.species, self.locus)
+ result = g.db.execute(query).fetchone()
+ if result:
+ self.locus_chr = result[0]
+ self.locus_mb = result[1]
+ else:
+ self.locus = self.locus_chr = self.locus_mb = self.additive = ""
+ else:
+ self.locus = self.locus_chr = self.locus_mb = self.additive = ""
else:
self.locus = self.lrs = self.additive = ""
+
+ if (self.dataset.type == 'Publish' or self.dataset.type == "ProbeSet") and self.locus_chr != "" and self.locus_mb != "":
+ #XZ: LRS_location_value is used for sorting
+ try:
+ LRS_location_value = int(self.locus_chr)*1000 + float(self.locus_mb)
+ except:
+ if self.locus_chr.upper() == 'X':
+ LRS_location_value = 20*1000 + float(self.locus_mb)
+ else:
+ LRS_location_value = ord(str(self.locus_chr).upper()[0])*1000 + float(self.locus_mb)
+
+ self.LRS_location_repr = LRS_location_repr = 'Chr%s: %.6f' % (self.locus_chr, float(self.locus_mb))
+ if self.lrs != "":
+ self.LRS_score_repr = LRS_score_repr = '%3.1f' % self.lrs
+ self.LRS_score_value = LRS_score_value = self.lrs
else:
raise KeyError, `self.name`+' information is not found in the database.'
@@ -646,7 +703,17 @@ class GeneralTrait(object):
ZValue = ZValue*sqrt(self.overlap-3)
self.p_value = 2.0*(1.0 - reaper.normp(abs(ZValue)))
-
+def convert_location_to_value(chromosome, mb):
+ try:
+ location_value = int(chromosome)*1000 + float(mb)
+ except ValueError:
+ if chromosome.upper() == 'X':
+ location_value = 20*1000 + float(mb)
+ else:
+ location_value = (ord(str(chromosome).upper()[0])*1000 +
+ float(mb))
+
+ return location_value
@app.route("/trait/get_sample_data")
def get_sample_data():
diff --git a/wqflask/base/webqtlCaseData.py b/wqflask/base/webqtlCaseData.py
index 42763aed..99a34866 100755
--- a/wqflask/base/webqtlCaseData.py
+++ b/wqflask/base/webqtlCaseData.py
@@ -29,8 +29,9 @@ print("Mr. Mojo Risin 2")
class webqtlCaseData(object):
"""one case data in one trait"""
- def __init__(self, name, value=None, variance=None, num_cases=None):
+ def __init__(self, name, value=None, variance=None, num_cases=None, name2=None):
self.name = name
+ self.name2 = name2 # Other name (for traits like BXD65a)
self.value = value # Trait Value
self.variance = variance # Trait Variance
self.num_cases = num_cases # Number of individuals/cases
diff --git a/wqflask/base/webqtlConfig.py b/wqflask/base/webqtlConfig.py
index 3eaeb56e..f6140ac3 100755..100644
--- a/wqflask/base/webqtlConfig.py
+++ b/wqflask/base/webqtlConfig.py
@@ -1,7 +1,15 @@
#########################################'
# Environment Variables - public
+#
+# Note: much of this needs to handled by the settings/environment
+# scripts. But rather than migrating everything in one go, we'll
+# take it a step at a time. First the hard coded paths get replaced
+# with those in utility/tools.py
+#
#########################################
+from utility.tools import valid_path, mk_dir, assert_dir, flat_files, TEMPDIR
+
#Debug Level
#1 for debug, mod python will reload import each time
DEBUG = 1
@@ -48,30 +56,28 @@ UCSC_RUDI_TRACK_URL = " http://genome.cse.ucsc.edu/cgi-bin/hgTracks?org=%s&db=%s
GENOMEBROWSER_URL="http://ucscbrowser.genenetwork.org/cgi-bin/hgTracks?clade=mammal&org=Mouse&db=mm9&position=%s&hgt.suggest=&pix=800&Submit=submit"
ENSEMBLETRANSCRIPT_URL="http://useast.ensembl.org/Mus_musculus/Lucene/Details?species=Mus_musculus;idx=Transcript;end=1;q=%s"
+# The following paths are no longer in use!
+# HTMLPATH is replaced by GENODIR
+# IMGDIR is replaced by GENERATED_IMAGE_DIR
+
+# Temporary storage:
+TMPDIR = mk_dir(TEMPDIR+'/gn2/')
+CACHEDIR = mk_dir(TEMPDIR+'/cache/')
+# We can no longer write into the git tree:
+GENERATED_IMAGE_DIR = mk_dir(TMPDIR+'/generated/')
+GENERATED_TEXT_DIR = mk_dir(TMPDIR+'/generated_text/')
+
+# Flat file directories
+GENODIR = flat_files('genotype')+'/'
+JSON_GENODIR = flat_files('genotype/json')+'/'
+if not valid_path(JSON_GENODIR):
+ # fall back on old location (move the dir, FIXME)
+ JSON_GENODIR = flat_files('json')
+assert_dir(GENODIR)
-GNROOT = "/home/zas1024/gene/" # Will remove this and dependent items later
-SECUREDIR = GNROOT + 'secure/'
-COMMON_LIB = GNROOT + 'support/admin'
-HTMLPATH = GNROOT + 'genotype_files/'
-PYLMM_PATH = '/home/zas1024/plink_gemma/'
-SNP_PATH = '/home/zas1024/snps/'
-IMGDIR = GNROOT + '/wqflask/wqflask/static/output/'
-IMAGESPATH = HTMLPATH + 'images/'
-UPLOADPATH = IMAGESPATH + 'upload/'
-TMPDIR = '/home/zas1024/tmp/' # Will remove this and dependent items later
-GENODIR = HTMLPATH + 'genotypes/'
-NEWGENODIR = HTMLPATH + 'new_genotypes/'
-GENO_ARCHIVE_DIR = GENODIR + 'archive/'
-TEXTDIR = HTMLPATH + 'ProbeSetFreeze_DataMatrix/'
-CMDLINEDIR = HTMLPATH + 'webqtl/cmdLine/'
-ChangableHtmlPath = GNROOT + 'web/'
-
-SITENAME = 'GN'
PORTADDR = "http://50.16.251.170"
-BASEHREF = '<base href="http://50.16.251.170/">'
+
INFOPAGEHREF = '/dbdoc/%s.html'
-GLOSSARYFILE = "/glossary.html"
CGIDIR = '/webqtl/' #XZ: The variable name 'CGIDIR' should be changed to 'PYTHONDIR'
SCRIPTFILE = 'main.py'
-REFRESHSTR = '<meta http-equiv="refresh" content="5;url=%s' + SCRIPTFILE +'?sid=%s">'
-REFRESHDIR = '%s' + SCRIPTFILE +'?sid=%s'
+
diff --git a/wqflask/base/webqtlFormData.py b/wqflask/base/webqtlFormData.py
index 44fdcc3f..10251756 100755
--- a/wqflask/base/webqtlFormData.py
+++ b/wqflask/base/webqtlFormData.py
@@ -157,7 +157,7 @@ class webqtlFormData(object):
self.genotype_1 = reaper.Dataset()
- full_filename = os.path.join(webqtlConfig.GENODIR, self.group + '.geno')
+ full_filename = locate(self.group + '.geno','genotype')
# reaper barfs on unicode filenames, so here we ensure it's a string
full_filename = str(full_filename)
diff --git a/wqflask/basicStatistics/BasicStatisticsFunctions.py b/wqflask/basicStatistics/BasicStatisticsFunctions.py
index 74784853..e748a822 100755
--- a/wqflask/basicStatistics/BasicStatisticsFunctions.py
+++ b/wqflask/basicStatistics/BasicStatisticsFunctions.py
@@ -118,7 +118,7 @@ def plotNormalProbability(vals=None, RISet='', title=None, showstrains=0, specia
Plot.plotXY(c, dataZ, dataX, dataLabel = dataLabel, XLabel='Expected Z score', connectdot=0, YLabel='Trait value', title=title, specialCases=specialStrains, showLabel = showLabel)
filename= webqtlUtil.genRandStr("nP_")
- c.save(webqtlConfig.IMGDIR+filename, format='gif')
+ c.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif')
img=HT.Image('/image/'+filename+'.gif',border=0)
@@ -145,7 +145,7 @@ def plotBoxPlot(vals):
Plot.plotBoxPlot(canvas, XXX, offset=(xLeftOffset, xRightOffset, yTopOffset, yBottomOffset), XLabel= "Trait")
filename= webqtlUtil.genRandStr("Box_")
- canvas.save(webqtlConfig.IMGDIR+filename, format='gif')
+ canvas.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif')
img=HT.Image('/image/'+filename+'.gif',border=0)
plotLink = HT.Span("More about ", HT.Href(text="Box Plots", url="http://davidmlane.com/hyperstat/A37797.html", target="_blank", Class="fs13"))
@@ -201,7 +201,7 @@ def plotBarGraph(identification='', RISet='', vals=None, type="name"):
Plot.plotBarText(c, tvals, tnames, variance=tvars, YLabel='Value', title=title, sLabel = sLabel, barSpace = sw)
filename= webqtlUtil.genRandStr("Bar_")
- c.save(webqtlConfig.IMGDIR+filename, format='gif')
+ c.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif')
img=HT.Image('/image/'+filename+'.gif',border=0)
return img
diff --git a/wqflask/maintenance/gen_select_dataset.py b/wqflask/maintenance/gen_select_dataset.py
index e080050e..489d291f 100755
--- a/wqflask/maintenance/gen_select_dataset.py
+++ b/wqflask/maintenance/gen_select_dataset.py
@@ -36,8 +36,7 @@ from __future__ import print_function, division
#print("cdict is:", cdict)
import sys
-sys.path.append("/home/zas1024/")
-import zach_settings
+import zach_settings # no hard code paths!
import MySQLdb
diff --git a/wqflask/maintenance/get_group_samplelists.py b/wqflask/maintenance/get_group_samplelists.py
index b8397b47..a9059fad 100755
--- a/wqflask/maintenance/get_group_samplelists.py
+++ b/wqflask/maintenance/get_group_samplelists.py
@@ -6,7 +6,6 @@ import gzip
from base import webqtlConfig
-
def process_genofiles(geno_dir=webqtlConfig.GENODIR):
print("Yabba")
#sys.exit("Dabba")
@@ -54,4 +53,4 @@ def get_samplelist_from_plink(genofilename):
line = line.split(" ")
samplelist.append(line[0])
- return samplelist \ No newline at end of file
+ return samplelist
diff --git a/wqflask/runserver.py b/wqflask/runserver.py
index 59ebf0d4..e4392b3f 100755
--- a/wqflask/runserver.py
+++ b/wqflask/runserver.py
@@ -25,8 +25,8 @@ file_handler = logging.FileHandler(app.config['LOGFILE'])
file_handler.setLevel(logging.DEBUG)
app.logger.addHandler(file_handler)
-import logging_tree
-logging_tree.printout()
+# import logging_tree
+# logging_tree.printout()
app.run(host='0.0.0.0',
port=app.config['SERVER_PORT'],
diff --git a/wqflask/secure_server.py b/wqflask/secure_server.py
deleted file mode 100755
index fc258578..00000000
--- a/wqflask/secure_server.py
+++ /dev/null
@@ -1,75 +0,0 @@
-from __future__ import absolute_import, division, print_function
-
-import time
-import sys
-
-from wqflask import app
-
-from flask import Flask, render_template
-
-import redis
-Redis = redis.StrictRedis()
-
-# Setup mail
-#from flask.ext.mail import Mail
-#mail = Mail(app)
-
-from wqflask.model import *
-
-# Create a user to test with
-##@app.before_first_request
-#def create_user():
-# db.create_all()
-# user_datastore.create_user(email='matt@example.com', password='notebook')
-# db.session.commit()
-
-import logging
-file_handler = logging.FileHandler(app.config['LOGFILE'])
-file_handler.setLevel(logging.DEBUG)
-app.logger.addHandler(file_handler)
-
-import logging_tree
-logging_tree.printout()
-
-#import sys
-#print("At startup, path is:", sys.path)
-
-from werkzeug.contrib.fixers import ProxyFix
-app.wsgi_app = ProxyFix(app.wsgi_app)
-
-#print("app.config is:", app.config)
-
-
-
-def check_send_mail_running():
- """Ensure send_mail.py is running before we start the site
-
- It would be really easy to accidentally run the site
- without our mail program running
- This will make sure our mail program is running...or at least recently run...
-
- """
- error_msg = "Make sure your are running send_mail.py"
- send_mail_ping = Redis.get("send_mail:ping")
- print("send_mail_ping is:", send_mail_ping)
- if not send_mail_ping:
- sys.exit(error_msg)
-
- last_ping = time.time() - float(send_mail_ping)
- if not (0 < last_ping < 100):
- sys.exit(error_msg)
-
-
- print("send_mail.py seems to be running...")
-
-
-if __name__ == '__main__':
- #create_user()
-
- check_send_mail_running()
-
- app.run(host='0.0.0.0',
- port=5002,
- use_debugger=True,
- threaded=True,
- use_reloader=True)
diff --git a/wqflask/utility/Plot.py b/wqflask/utility/Plot.py
index 51a57a6d..444c71c9 100755..100644
--- a/wqflask/utility/Plot.py
+++ b/wqflask/utility/Plot.py
@@ -24,10 +24,9 @@
#
# Last updated by GeneNetwork Core Team 2010/10/20
-#import piddle as pid
-
from __future__ import print_function
+import piddle as pid
from pprint import pformat as pf
print("Lysol")
@@ -478,181 +477,181 @@ def plotSecurity(canvas, text="12345"):
# parameter: data is either object returned by reaper permutation function (called by MarkerRegressionPage.py)
# or the first object returned by direct (pair-scan) permu function (called by DirectPlotPage.py)
-#def plotBar(canvas, data, barColor=pid.blue, axesColor=pid.black, labelColor=pid.black, XLabel=None, YLabel=None, title=None, offset= (60, 20, 40, 40), zoom = 1):
-#
-# xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
-#
-# plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
-# plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
-# if plotHeight<=0 or plotWidth<=0:
-# return
-#
-# if len(data) < 2:
-# return
-#
-# max_D = max(data)
-# min_D = min(data)
-# #add by NL 06-20-2011: fix the error: when max_D is infinite, log function in detScale will go wrong
-# if max_D == float('inf') or max_D>webqtlConfig.MAXLRS:
-# max_D=webqtlConfig.MAXLRS #maximum LRS value
-#
-# xLow, xTop, stepX = detScale(min_D, max_D)
-#
-# #reduce data
-# step = ceil((xTop-xLow)/50.0)
-# j = xLow
-# dataXY = []
-# Count = []
-# while j <= xTop:
-# dataXY.append(j)
-# Count.append(0)
-# j += step
-#
-# for i, item in enumerate(data):
-# if item == float('inf') or item>webqtlConfig.MAXLRS:
-# item = webqtlConfig.MAXLRS #maximum LRS value
-# j = int((item-xLow)/step)
-# Count[j] += 1
-#
-# yLow, yTop, stepY=detScale(0,max(Count))
-#
-# #draw data
-# xScale = plotWidth/(xTop-xLow)
-# yScale = plotHeight/(yTop-yLow)
-# barWidth = xScale*step
-#
-# for i, count in enumerate(Count):
-# if count:
-# xc = (dataXY[i]-xLow)*xScale+xLeftOffset
-# yc =-(count-yLow)*yScale+yTopOffset+plotHeight
-# canvas.drawRect(xc+2,yc,xc+barWidth-2,yTopOffset+plotHeight,edgeColor=barColor,fillColor=barColor)
-#
-# #draw drawing region
-# canvas.drawRect(xLeftOffset, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight)
-#
-# #draw scale
-# scaleFont=pid.Font(ttf="cour",size=11,bold=1)
-# x=xLow
-# for i in range(stepX+1):
-# xc=xLeftOffset+(x-xLow)*xScale
-# canvas.drawLine(xc,yTopOffset+plotHeight,xc,yTopOffset+plotHeight+5, color=axesColor)
-# strX = cformat(d=x, rank=0)
-# canvas.drawString(strX,xc-canvas.stringWidth(strX,font=scaleFont)/2,yTopOffset+plotHeight+14,font=scaleFont)
-# x+= (xTop - xLow)/stepX
-#
-# y=yLow
-# for i in range(stepY+1):
-# yc=yTopOffset+plotHeight-(y-yLow)*yScale
-# canvas.drawLine(xLeftOffset,yc,xLeftOffset-5,yc, color=axesColor)
-# strY = "%d" %y
-# canvas.drawString(strY,xLeftOffset-canvas.stringWidth(strY,font=scaleFont)-6,yc+5,font=scaleFont)
-# y+= (yTop - yLow)/stepY
-#
-# #draw label
-# labelFont=pid.Font(ttf="tahoma",size=17,bold=0)
-# if XLabel:
-# canvas.drawString(XLabel,xLeftOffset+(plotWidth-canvas.stringWidth(XLabel,font=labelFont))/2.0,
-# yTopOffset+plotHeight+yBottomOffset-10,font=labelFont,color=labelColor)
-#
-# if YLabel:
-# canvas.drawString(YLabel, 19, yTopOffset+plotHeight-(plotHeight-canvas.stringWidth(YLabel,font=labelFont))/2.0,
-# font=labelFont,color=labelColor,angle=90)
-#
-# labelFont=pid.Font(ttf="verdana",size=16,bold=0)
-# if title:
-# canvas.drawString(title,xLeftOffset+(plotWidth-canvas.stringWidth(title,font=labelFont))/2.0,
-# 20,font=labelFont,color=labelColor)
-#
-#def plotBarText(canvas, data, label, variance=None, barColor=pid.blue, axesColor=pid.black, labelColor=pid.black, XLabel=None, YLabel=None, title=None, sLabel = None, offset= (80, 20, 40, 100), barSpace = 2, zoom = 1):
-# xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
-# plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
-# plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
-# if plotHeight<=0 or plotWidth<=0:
-# return
-#
-# NNN = len(data)
-# if NNN < 2 or NNN != len(label):
-# return
-# if variance and len(variance)!=NNN:
-# variance = []
-#
-# Y2 = data[:]
-# if variance:
-# for i in range(NNN):
-# if variance[i]:
-# Y2 += [data[i]-variance[i]]
-#
-# #Y axis
-# YLow, YTop, stepY = detScale(min(Y2), max(Y2))
-# YScale = plotHeight/(YTop - YLow)
-#
-# if YLow < 0 and YTop > 0:
-# drawZero = 1
-# else:
-# drawZero = 0
-#
-# #X axis
-# X = range(NNN)
-# Xll= 0
-# Xur= NNN-1
-#
-#
-# if drawZero:
-# YZero = yTopOffset+plotHeight-YScale*(0-YLow)
-# canvas.drawLine(xLeftOffset, YZero, xLeftOffset+plotWidth, YZero)
-# else:
-# YZero = yTopOffset+plotHeight
-# #draw data
-# spaceWidth = barSpace
-# if spaceWidth < 1:
-# spaceWidth = 1
-# barWidth = int((plotWidth - (NNN-1.0)*spaceWidth)/NNN)
-#
-# xc= xLeftOffset
-# scaleFont=pid.Font(ttf="verdana",size=11,bold=0)
-# for i in range(NNN):
-# yc = yTopOffset+plotHeight-(data[i]-YLow)*YScale
-# canvas.drawRect(xc,YZero,xc+barWidth-1, yc, edgeColor=barColor,fillColor=barColor)
-# if variance and variance[i]:
-# varlen = variance[i]*YScale
-# if yc-varlen < yTopOffset:
-# topYd = yTopOffset
-# else:
-# topYd = yc-varlen
-# canvas.drawLine(xc+barWidth/2-2,yc-varlen,xc+barWidth/2+2,yc-varlen,color=pid.red)
-# canvas.drawLine(xc+barWidth/2,yc+varlen,xc+barWidth/2,topYd,color=pid.red)
-# canvas.drawLine(xc+barWidth/2-2,yc+varlen,xc+barWidth/2+2,yc+varlen,color=pid.red)
-# strX = label[i]
-# canvas.drawString(strX,xc+barWidth/2.0+2,yTopOffset+plotHeight+2+canvas.stringWidth(strX,font=scaleFont),font=scaleFont,angle=90)
-# xc += barWidth + spaceWidth
-#
-# #draw drawing region
-# canvas.drawRect(xLeftOffset, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight)
-#
-# #draw Y scale
-# scaleFont=pid.Font(ttf="cour",size=16,bold=1)
-# y=YLow
-# for i in range(stepY+1):
-# yc=yTopOffset+plotHeight-(y-YLow)*YScale
-# canvas.drawLine(xLeftOffset,yc,xLeftOffset-5,yc, color=axesColor)
-# strY = cformat(d=y, rank=0)
-# canvas.drawString(strY,xLeftOffset-canvas.stringWidth(strY,font=scaleFont)-6,yc+5,font=scaleFont)
-# y+= (YTop - YLow)/stepY
-#
-# #draw label
-# labelFont=pid.Font(ttf="verdana",size=17,bold=0)
-# if XLabel:
-# canvas.drawString(XLabel,xLeftOffset+(plotWidth-canvas.stringWidth(XLabel,font=labelFont))/2.0,yTopOffset+plotHeight+65,font=labelFont,color=labelColor)
-#
-# if YLabel:
-# canvas.drawString(YLabel,xLeftOffset-50, yTopOffset+plotHeight-(plotHeight-canvas.stringWidth(YLabel,font=labelFont))/2.0,font=labelFont,color=labelColor,angle=90)
-#
-# labelFont=pid.Font(ttf="verdana",size=18,bold=0)
-# if title:
-# canvas.drawString(title,xLeftOffset,yTopOffset-15,font=labelFont,color=labelColor)
-#
-# return
-#
+def plotBar(canvas, data, barColor=pid.blue, axesColor=pid.black, labelColor=pid.black, XLabel=None, YLabel=None, title=None, offset= (60, 20, 40, 40), zoom = 1):
+ xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
+
+ plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
+ plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
+ if plotHeight<=0 or plotWidth<=0:
+ return
+
+ if len(data) < 2:
+ return
+
+ max_D = max(data)
+ min_D = min(data)
+ #add by NL 06-20-2011: fix the error: when max_D is infinite, log function in detScale will go wrong
+ if max_D == float('inf') or max_D>webqtlConfig.MAXLRS:
+ max_D=webqtlConfig.MAXLRS #maximum LRS value
+
+ xLow, xTop, stepX = detScale(min_D, max_D)
+
+ #reduce data
+ #ZS: Used to determine number of bins for permutation output
+ step = ceil((xTop-xLow)/50.0)
+ j = xLow
+ dataXY = []
+ Count = []
+ while j <= xTop:
+ dataXY.append(j)
+ Count.append(0)
+ j += step
+
+ for i, item in enumerate(data):
+ if item == float('inf') or item>webqtlConfig.MAXLRS:
+ item = webqtlConfig.MAXLRS #maximum LRS value
+ j = int((item-xLow)/step)
+ Count[j] += 1
+
+ yLow, yTop, stepY=detScale(0,max(Count))
+
+ #draw data
+ xScale = plotWidth/(xTop-xLow)
+ yScale = plotHeight/(yTop-yLow)
+ barWidth = xScale*step
+
+ for i, count in enumerate(Count):
+ if count:
+ xc = (dataXY[i]-xLow)*xScale+xLeftOffset
+ yc =-(count-yLow)*yScale+yTopOffset+plotHeight
+ canvas.drawRect(xc+2,yc,xc+barWidth-2,yTopOffset+plotHeight,edgeColor=barColor,fillColor=barColor)
+
+ #draw drawing region
+ canvas.drawRect(xLeftOffset, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight)
+
+ #draw scale
+ scaleFont=pid.Font(ttf="cour",size=11,bold=1)
+ x=xLow
+ for i in range(int(stepX)+1):
+ xc=xLeftOffset+(x-xLow)*xScale
+ canvas.drawLine(xc,yTopOffset+plotHeight,xc,yTopOffset+plotHeight+5, color=axesColor)
+ strX = cformat(d=x, rank=0)
+ canvas.drawString(strX,xc-canvas.stringWidth(strX,font=scaleFont)/2,yTopOffset+plotHeight+14,font=scaleFont)
+ x+= (xTop - xLow)/stepX
+
+ y=yLow
+ for i in range(int(stepY)+1):
+ yc=yTopOffset+plotHeight-(y-yLow)*yScale
+ canvas.drawLine(xLeftOffset,yc,xLeftOffset-5,yc, color=axesColor)
+ strY = "%d" %y
+ canvas.drawString(strY,xLeftOffset-canvas.stringWidth(strY,font=scaleFont)-6,yc+5,font=scaleFont)
+ y+= (yTop - yLow)/stepY
+
+ #draw label
+ labelFont=pid.Font(ttf="tahoma",size=17,bold=0)
+ if XLabel:
+ canvas.drawString(XLabel,xLeftOffset+(plotWidth-canvas.stringWidth(XLabel,font=labelFont))/2.0,
+ yTopOffset+plotHeight+yBottomOffset-10,font=labelFont,color=labelColor)
+
+ if YLabel:
+ canvas.drawString(YLabel, 19, yTopOffset+plotHeight-(plotHeight-canvas.stringWidth(YLabel,font=labelFont))/2.0,
+ font=labelFont,color=labelColor,angle=90)
+
+ labelFont=pid.Font(ttf="verdana",size=16,bold=0)
+ if title:
+ canvas.drawString(title,xLeftOffset+(plotWidth-canvas.stringWidth(title,font=labelFont))/2.0,
+ 20,font=labelFont,color=labelColor)
+
+def plotBarText(canvas, data, label, variance=None, barColor=pid.blue, axesColor=pid.black, labelColor=pid.black, XLabel=None, YLabel=None, title=None, sLabel = None, offset= (80, 20, 40, 100), barSpace = 2, zoom = 1):
+ xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
+ plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
+ plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
+ if plotHeight<=0 or plotWidth<=0:
+ return
+
+ NNN = len(data)
+ if NNN < 2 or NNN != len(label):
+ return
+ if variance and len(variance)!=NNN:
+ variance = []
+
+ Y2 = data[:]
+ if variance:
+ for i in range(NNN):
+ if variance[i]:
+ Y2 += [data[i]-variance[i]]
+
+ #Y axis
+ YLow, YTop, stepY = detScale(min(Y2), max(Y2))
+ YScale = plotHeight/(YTop - YLow)
+
+ if YLow < 0 and YTop > 0:
+ drawZero = 1
+ else:
+ drawZero = 0
+
+ #X axis
+ X = range(NNN)
+ Xll= 0
+ Xur= NNN-1
+
+
+ if drawZero:
+ YZero = yTopOffset+plotHeight-YScale*(0-YLow)
+ canvas.drawLine(xLeftOffset, YZero, xLeftOffset+plotWidth, YZero)
+ else:
+ YZero = yTopOffset+plotHeight
+ #draw data
+ spaceWidth = barSpace
+ if spaceWidth < 1:
+ spaceWidth = 1
+ barWidth = int((plotWidth - (NNN-1.0)*spaceWidth)/NNN)
+
+ xc= xLeftOffset
+ scaleFont=pid.Font(ttf="verdana",size=11,bold=0)
+ for i in range(NNN):
+ yc = yTopOffset+plotHeight-(data[i]-YLow)*YScale
+ canvas.drawRect(xc,YZero,xc+barWidth-1, yc, edgeColor=barColor,fillColor=barColor)
+ if variance and variance[i]:
+ varlen = variance[i]*YScale
+ if yc-varlen < yTopOffset:
+ topYd = yTopOffset
+ else:
+ topYd = yc-varlen
+ canvas.drawLine(xc+barWidth/2-2,yc-varlen,xc+barWidth/2+2,yc-varlen,color=pid.red)
+ canvas.drawLine(xc+barWidth/2,yc+varlen,xc+barWidth/2,topYd,color=pid.red)
+ canvas.drawLine(xc+barWidth/2-2,yc+varlen,xc+barWidth/2+2,yc+varlen,color=pid.red)
+ strX = label[i]
+ canvas.drawString(strX,xc+barWidth/2.0+2,yTopOffset+plotHeight+2+canvas.stringWidth(strX,font=scaleFont),font=scaleFont,angle=90)
+ xc += barWidth + spaceWidth
+
+ #draw drawing region
+ canvas.drawRect(xLeftOffset, yTopOffset, xLeftOffset+plotWidth, yTopOffset+plotHeight)
+
+ #draw Y scale
+ scaleFont=pid.Font(ttf="cour",size=16,bold=1)
+ y=YLow
+ for i in range(stepY+1):
+ yc=yTopOffset+plotHeight-(y-YLow)*YScale
+ canvas.drawLine(xLeftOffset,yc,xLeftOffset-5,yc, color=axesColor)
+ strY = cformat(d=y, rank=0)
+ canvas.drawString(strY,xLeftOffset-canvas.stringWidth(strY,font=scaleFont)-6,yc+5,font=scaleFont)
+ y+= (YTop - YLow)/stepY
+
+ #draw label
+ labelFont=pid.Font(ttf="verdana",size=17,bold=0)
+ if XLabel:
+ canvas.drawString(XLabel,xLeftOffset+(plotWidth-canvas.stringWidth(XLabel,font=labelFont))/2.0,yTopOffset+plotHeight+65,font=labelFont,color=labelColor)
+
+ if YLabel:
+ canvas.drawString(YLabel,xLeftOffset-50, yTopOffset+plotHeight-(plotHeight-canvas.stringWidth(YLabel,font=labelFont))/2.0,font=labelFont,color=labelColor,angle=90)
+
+ labelFont=pid.Font(ttf="verdana",size=18,bold=0)
+ if title:
+ canvas.drawString(title,xLeftOffset,yTopOffset-15,font=labelFont,color=labelColor)
+
+ return
+
#def plotXY(canvas, dataX, dataY, rank=0, dataLabel=[], plotColor = pid.black, axesColor=pid.black, labelColor=pid.black, lineSize="thin", lineColor=pid.grey, idFont="arial", idColor=pid.blue, idSize="14", symbolColor=pid.black, symbolType="circle", filled="yes", symbolSize="tiny", XLabel=None, YLabel=None, title=None, fitcurve=None, connectdot=1, displayR=None, loadingPlot = 0, offset= (80, 20, 40, 60), zoom = 1, specialCases=[], showLabel = 1, bufferSpace = 15):
# 'displayR : correlation scatter plot, loadings : loading plot'
#
diff --git a/wqflask/utility/external.py b/wqflask/utility/external.py
new file mode 100644
index 00000000..50afea08
--- /dev/null
+++ b/wqflask/utility/external.py
@@ -0,0 +1,9 @@
+# Call external program
+
+import os
+import sys
+import subprocess
+
+def shell(command):
+ if subprocess.call(command, shell=True) != 0:
+ raise Exception("ERROR: failed on "+command)
diff --git a/wqflask/utility/genofile_parser.py b/wqflask/utility/genofile_parser.py
new file mode 100644
index 00000000..67b84dc9
--- /dev/null
+++ b/wqflask/utility/genofile_parser.py
@@ -0,0 +1,100 @@
+# CTL analysis for GN2
+# Author / Maintainer: Danny Arends <Danny.Arends@gmail.com>
+
+from __future__ import print_function, division, absolute_import
+import sys
+import os
+import glob
+import traceback
+import gzip
+
+
+import simplejson as json
+
+from pprint import pformat as pf
+
+class Marker(object):
+ def __init__(self):
+ self.name = None
+ self.chr = None
+ self.cM = None
+ self.Mb = None
+ self.genotypes = []
+
+
+class ConvertGenoFile(object):
+
+ def __init__(self, input_file):
+ self.mb_exists = False
+ self.cm_exists = False
+ self.markers = []
+
+ self.latest_row_pos = None
+ self.latest_col_pos = None
+
+ self.latest_row_value = None
+ self.latest_col_value = None
+ self.input_fh = open(input_file)
+ print("!!!!!!!!!!!!!!!!PARSER!!!!!!!!!!!!!!!!!!")
+ self.haplotype_notation = {
+ '@mat': "1",
+ '@pat': "2",
+ '@het': "-999",
+ '@unk': "-999"
+ }
+ self.configurations = {}
+
+ def process_rows(self):
+ for self.latest_row_pos, row in enumerate(self.input_fh):
+ self.latest_row_value = row
+ # Take care of headers
+ if not row.strip():
+ continue
+ if row.startswith('#'):
+ continue
+ if row.startswith('Chr'):
+ if 'Mb' in row.split():
+ self.mb_exists = True
+ if 'cM' in row.split():
+ self.cm_exists = True
+ skip = 2 + self.cm_exists + self.mb_exists
+ self.individuals = row.split()[skip:]
+ continue
+ if row.startswith('@'):
+ key, _separater, value = row.partition(':')
+ key = key.strip()
+ value = value.strip()
+ if key in self.haplotype_notation:
+ self.configurations[value] = self.haplotype_notation[key]
+ continue
+ if not len(self.configurations):
+ raise EmptyConfigurations
+ yield row
+
+ def process_csv(self):
+ for row_count, row in enumerate(self.process_rows()):
+ row_items = row.split("\t")
+
+ this_marker = Marker()
+ this_marker.name = row_items[1]
+ this_marker.chr = row_items[0]
+ if self.cm_exists and self.mb_exists:
+ this_marker.cM = row_items[2]
+ this_marker.Mb = row_items[3]
+ genotypes = row_items[4:]
+ elif self.cm_exists:
+ this_marker.cM = row_items[2]
+ genotypes = row_items[3:]
+ elif self.mb_exists:
+ this_marker.Mb = row_items[2]
+ genotypes = row_items[3:]
+ else:
+ genotypes = row_items[2:]
+ for item_count, genotype in enumerate(genotypes):
+ if genotype.upper().strip() in self.configurations:
+ this_marker.genotypes.append(self.configurations[genotype.upper().strip()])
+ else:
+ print("WARNING:", genotype.upper())
+ this_marker.genotypes.append("NA")
+ self.markers.append(this_marker.__dict__)
+
diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py
index b8a41f60..dd8c4a1e 100644
--- a/wqflask/utility/tools.py
+++ b/wqflask/utility/tools.py
@@ -1,84 +1,137 @@
# Tools/paths finder resolves external paths from settings and/or environment
# variables
-#
-# Currently supported:
-#
-# PYLMM_PATH finds the root of the git repository of the pylmm_gn2 tool
import os
import sys
from wqflask import app
-def get_setting(id,default,guess,get_valid_path):
- """
- Resolve a setting from the environment or the global settings in app.config
+def get_setting(command_id,guess=None):
+ """Resolve a setting from the environment or the global settings in
+ app.config, with get_valid_path is a function checking whether the
+ path points to an expected directory and returns the full path to
+ the binary command
+
+ guess = os.environ.get('HOME')+'/pylmm'
+ get_setting('PYLMM_PATH',guess)
+
+ first tries the environment variable in +id+, next gets the Flask
+ app setting for the same +id+ and finally does an educated
+ +guess+.
+
+ In all, the environment overrides the others, next is the flask
+ setting, then the guess. A valid path to the binary command is
+ returned. If none is resolved an exception is thrown.
+
+ Note that we do not use the system path. This is on purpose
+ because it will mess up controlled (reproducible) deployment. The
+ proper way is to either use the GNU Guix defaults as listed in
+ etc/default_settings.py or override them yourself by creating a
+ different settings.py file (or setting the environment).
+
"""
+ def value(command):
+ if command:
+ sys.stderr.write("Found path "+command+"\n")
+ return command
+ else:
+ return None
+
# ---- Check whether environment exists
- path = get_valid_path(os.environ.get(id))
- # ---- Check whether setting exists
- setting = app.config.get(id)
- if not path:
- path = get_valid_path(setting)
- # ---- Check whether default exists
- if not path:
- path = get_valid_path(default)
- # ---- Guess directory
- if not path:
- if not setting:
- setting = guess
- path = get_valid_path(guess)
- if not path:
- raise Exception(id+' '+setting+' path unknown or faulty (update settings.py?). '+id+' should point to the root of the git repository')
-
- return path
-
-def pylmm_command(default=None):
+ sys.stderr.write("Looking for "+command_id+"\n")
+ command = value(os.environ.get(command_id))
+ if not command:
+ # ---- Check whether setting exists in app
+ command = value(app.config.get(command_id))
+ if not command:
+ command = value(guess)
+ if not command:
+ raise Exception(command_id+' path unknown or faulty (update settings.py?). '+command_id+' should point to the path')
+ return command
+
+def valid_bin(bin):
+ if os.path.islink(bin) or valid_file(bin):
+ return bin
+ return None
+
+def valid_file(fn):
+ if os.path.isfile(fn):
+ return fn
+ return None
+
+def valid_path(dir):
+ if os.path.isdir(dir):
+ return dir
+ return None
+
+def pylmm_command(guess=None):
+ return valid_bin(get_setting("PYLMM_COMMAND",guess))
+
+def gemma_command(guess=None):
+ return valid_bin(get_setting("GEMMA_COMMAND",guess))
+
+def plink_command(guess=None):
+ return valid_bin(get_setting("PLINK_COMMAND",guess))
+
+def flat_files(subdir=None):
+ base = get_setting("GENENETWORK_FILES")
+ if subdir:
+ return assert_dir(base+"/"+subdir)
+ return assert_dir(base)
+
+def assert_dir(dir):
+ if not valid_path(dir):
+ raise Exception("ERROR: can not find directory "+dir)
+ return dir
+
+def mk_dir(dir):
+ if not valid_path(dir):
+ os.makedirs(dir)
+ return assert_dir(dir)
+
+def locate(name, subdir=None):
"""
- Return the path to the repository and the python command to call
+ Locate a static flat file in the GENENETWORK_FILES environment.
+
+ This function throws an error when the file is not found.
"""
- def get_valid_path(path):
- """Test for a valid repository"""
- if path:
- sys.stderr.write("Trying PYLMM_PATH in "+path+"\n")
- if path and os.path.isfile(path+'/pylmm_gn2/lmm.py'):
- return path
+ base = get_setting("GENENETWORK_FILES")
+ if subdir:
+ base = base+"/"+subdir
+ if valid_path(base):
+ lookfor = base + "/" + name
+ if valid_file(lookfor):
+ print("Found: file "+lookfor+"\n")
+ return lookfor
else:
- None
+ raise Exception("Can not locate "+lookfor)
+ if subdir: sys.stderr.write(subdir)
+ raise Exception("Can not locate "+name+" in "+base)
- guess = os.environ.get('HOME')+'/pylmm_gn2'
- path = get_setting('PYLMM_PATH',default,guess,get_valid_path)
- pylmm_command = 'python '+path+'/pylmm_gn2/lmm.py'
- return path,pylmm_command
-
-def plink_command(default=None):
+def locate_ignore_error(name, subdir=None):
"""
- Return the path to the repository and the python command to call
+ Locate a static flat file in the GENENETWORK_FILES environment.
+
+ This function does not throw an error when the file is not found
+ but returns None.
"""
- def get_valid_path(path):
- """Test for a valid repository"""
- if path:
- sys.stderr.write("Trying PLINK_PATH in "+path+"\n")
- if path and os.path.isfile(path+'/plink'):
- return path
- else:
- None
-
- guess = os.environ.get('HOME')+'/plink_gemma'
- path = get_setting('PLINK_PATH',default,guess,get_valid_path)
- plink_command = path+'/plink'
- return path,plink_command
-
-def gemma_command(default=None):
- def get_valid_path(path):
- """Test for a valid repository"""
- if path:
- sys.stderr.write("Trying PLINK_PATH in "+path+"\n")
- if path and os.path.isfile(path+'/plink'):
- return path
- else:
- None
+ base = get_setting("GENENETWORK_FILES")
+ if subdir:
+ base = base+"/"+subdir
+ if valid_path(base):
+ lookfor = base + "/" + name
+ if valid_file(lookfor):
+ print("Found: file "+name+"\n")
+ return lookfor
+ sys.stderr.write("WARNING: file "+name+" not found\n")
+ return None
+
+def tempdir():
+ return valid_path(get_setting("TEMPDIR","/tmp"))
- guess = os.environ.get('HOME')+'/plink'
- path = get_setting('PLINK_PATH',default,guess,get_valid_path)
- gemma_command = path+'/gemma'
- return path, gemma_command \ No newline at end of file
+
+# Cached values
+PYLMM_COMMAND = pylmm_command()
+GEMMA_COMMAND = gemma_command()
+PLINK_COMMAND = plink_command()
+FLAT_FILES = flat_files()
+TEMPDIR = tempdir()
diff --git a/wqflask/utility/webqtlUtil.py b/wqflask/utility/webqtlUtil.py
index f842dde0..1108614b 100755
--- a/wqflask/utility/webqtlUtil.py
+++ b/wqflask/utility/webqtlUtil.py
@@ -509,7 +509,7 @@ def calCorrelationRank(xVals,yVals,N):
j = 0
for i in range(len(xVals)):
- if xVals[i]!= None and yVals[i]!= None:
+ if (xVals[i]!= None and yVals[i]!= None) and (xVals[i] != "None" and yVals[i] != "None"):
XX.append((j,xVals[i]))
YY.append((j,yVals[i]))
j = j+1
diff --git a/wqflask/wqflask/collect.py b/wqflask/wqflask/collect.py
index 750f4757..9227d641 100755..100644
--- a/wqflask/wqflask/collect.py
+++ b/wqflask/wqflask/collect.py
@@ -15,7 +15,7 @@ import urlparse
import simplejson as json
-from sqlalchemy import orm
+#from sqlalchemy import orm
#from redis import StrictRedis
import redis
@@ -243,8 +243,6 @@ def list_collections():
)
except:
return redirect(url_for('view_collection'))
- #return render_template("collections/view_anonymous.html",
- # params = params)
@app.route("/collections/remove", methods=('POST',))
diff --git a/wqflask/wqflask/correlation/show_corr_results.py b/wqflask/wqflask/correlation/show_corr_results.py
index 98596ca4..c1ad1c84 100755..100644
--- a/wqflask/wqflask/correlation/show_corr_results.py
+++ b/wqflask/wqflask/correlation/show_corr_results.py
@@ -50,6 +50,7 @@ from dbFunction import webqtlDatabaseFunction
import utility.webqtlUtil #this is for parallel computing only.
from wqflask.correlation import correlation_functions
from utility.benchmark import Bench
+import utility.webqtlUtil
from MySQLdb import escape_string as escape
@@ -159,6 +160,9 @@ class CorrelationResults(object):
self.correlation_data = {}
+ db_filename = self.getFileName(target_db_name = self.target_dataset.name)
+ cache_available = db_filename in os.listdir(webqtlConfig.GENERATED_TEXT_DIR)
+
if self.corr_type == "tissue":
self.trait_symbol_dict = self.dataset.retrieve_genes("Symbol")
@@ -174,9 +178,25 @@ class CorrelationResults(object):
self.get_sample_r_and_p_values(trait, self.target_dataset.trait_data[trait])
elif self.corr_type == "sample":
- # print("self.target_dataset.trait_data: %d" % len(self.target_dataset.trait_data))
- for trait, values in self.target_dataset.trait_data.iteritems():
- self.get_sample_r_and_p_values(trait, values)
+ if self.dataset.type == "ProbeSet" and cache_available:
+ dataset_file = open(webqtlConfig.GENERATED_TEXT_DIR+db_filename,'r')
+
+ #XZ, 01/08/2009: read the first line
+ line = dataset_file.readline()
+ dataset_strains = webqtlUtil.readLineCSV(line)[1:]
+
+ self.this_trait_vals = []
+ for item in dataset_strains:
+ if item in self.sample_data:
+ self.this_trait_vals.append(self.sample_data[item])
+ else:
+ self.this_trait_vals.append("None")
+ num_overlap = len(self.this_trait_vals)
+
+ self.do_parallel_correlation(db_filename, num_overlap)
+ else:
+ for trait, values in self.target_dataset.trait_data.iteritems():
+ self.get_sample_r_and_p_values(trait, values)
self.correlation_data = collections.OrderedDict(sorted(self.correlation_data.items(),
key=lambda t: -abs(t[1][0])))
@@ -190,7 +210,7 @@ class CorrelationResults(object):
range_chr_as_int = order_id
for _trait_counter, trait in enumerate(self.correlation_data.keys()[:self.return_number]):
- trait_object = GeneralTrait(dataset=self.target_dataset, name=trait, get_qtl_info=True)
+ trait_object = GeneralTrait(dataset=self.target_dataset, name=trait, get_qtl_info=True, get_sample_info=False)
if self.dataset.type == "ProbeSet" or self.dataset.type == "Geno":
#ZS: Convert trait chromosome to an int for the location range option
@@ -308,7 +328,7 @@ class CorrelationResults(object):
#traitList = self.correlate()
- #_log.info("Done doing correlation calculation")
+ #print("Done doing correlation calculation")
############################################################################################################################################
@@ -521,27 +541,126 @@ class CorrelationResults(object):
"""
- # print("len(self.sample_data):", len(self.sample_data))
-
- this_trait_vals = []
+ self.this_trait_vals = []
target_vals = []
for index, sample in enumerate(self.target_dataset.samplelist):
if sample in self.sample_data:
sample_value = self.sample_data[sample]
target_sample_value = target_samples[index]
- this_trait_vals.append(sample_value)
+ self.this_trait_vals.append(sample_value)
target_vals.append(target_sample_value)
- this_trait_vals, target_vals, num_overlap = corr_result_helpers.normalize_values(
- this_trait_vals, target_vals)
+ self.this_trait_vals, target_vals, num_overlap = corr_result_helpers.normalize_values(self.this_trait_vals, target_vals)
#ZS: 2015 could add biweight correlation, see http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3465711/
if self.corr_method == 'pearson':
- sample_r, sample_p = scipy.stats.pearsonr(this_trait_vals, target_vals)
+ sample_r, sample_p = scipy.stats.pearsonr(self.this_trait_vals, target_vals)
else:
- sample_r, sample_p = scipy.stats.spearmanr(this_trait_vals, target_vals)
+ sample_r, sample_p = scipy.stats.spearmanr(self.this_trait_vals, target_vals)
- self.correlation_data[trait] = [sample_r, sample_p, num_overlap]
+ if num_overlap > 5:
+ self.correlation_data[trait] = [sample_r, sample_p, num_overlap]
+
+
+ """
+ correlations = []
+
+ #XZ: Use the fast method only for probeset dataset, and this dataset must have been created.
+ #XZ: Otherwise, use original method
+ #print("Entering correlation")
+
+ #db_filename = self.getFileName(target_db_name=self.target_db_name)
+ #
+ #cache_available = db_filename in os.listdir(webqtlConfig.GENERATED_TEXT_DIR)
+
+ # If the cache file exists, do a cached correlation for probeset data
+ if self.dataset.type == "ProbeSet":
+# if self.method in [METHOD_SAMPLE_PEARSON, METHOD_SAMPLE_RANK] and cache_available:
+# traits = do_parallel_correlation()
+#
+# else:
+
+ traits = self.get_traits(self.vals)
+
+ for trait in traits:
+ trait.calculate_correlation(vals, self.method)
+
+ self.record_count = len(traits) #ZS: This isn't a good way to get this value, so I need to change it later
+
+ #XZ, 3/31/2010: Theoretically, we should create one function 'comTissueCorr'
+ #to compare each trait by their tissue corr p values.
+ #But because the tissue corr p values are generated by permutation test,
+ #the top ones always have p value 0. So comparing p values actually does nothing.
+ #In addition, for the tissue data in our database, the N is always the same.
+ #So it's safe to compare with tissue corr statistic value.
+ #That's the same as literature corr.
+ #if self.method in [METHOD_LIT, METHOD_TISSUE_PEARSON, METHOD_TISSUE_RANK] and self.gene_id:
+ # traits.sort(webqtlUtil.cmpLitCorr)
+ #else:
+ #if self.method in TISSUE_METHODS:
+ # sort(traits, key=lambda A: math.fabs(A.tissue_corr))
+ #elif self.method == METHOD_LIT:
+ # traits.sort(traits, key=lambda A: math.fabs(A.lit_corr))
+ #else:
+ traits = sortTraitCorrelations(traits, self.method)
+
+ # Strip to the top N correlations
+ traits = traits[:min(self.returnNumber, len(traits))]
+
+ addLiteratureCorr = False
+ addTissueCorr = False
+
+ trait_list = []
+ for trait in traits:
+ db_trait = webqtlTrait(db=self.db, name=trait.name, cursor=self.cursor)
+ db_trait.retrieveInfo( QTL='Yes' )
+
+ db_trait.Name = trait.name
+ db_trait.corr = trait.correlation
+ db_trait.nOverlap = trait.overlap
+ db_trait.corrPValue = trait.p_value
+
+ # NL, 07/19/2010
+ # js function changed, add a new parameter rankOrder for js function 'showTissueCorrPlot'
+ db_trait.RANK_ORDER = self.RANK_ORDERS[self.method]
+
+ #XZ, 26/09/2008: Method is 4 or 5. Have fetched tissue corr, but no literature correlation yet.
+ if self.method in TISSUE_METHODS:
+ db_trait.tissueCorr = trait.tissue_corr
+ db_trait.tissuePValue = trait.p_tissue
+ addTissueCorr = True
+
+
+ #XZ, 26/09/2008: Method is 3, Have fetched literature corr, but no tissue corr yet.
+ elif self.method == METHOD_LIT:
+ db_trait.LCorr = trait.lit_corr
+ db_trait.mouse_geneid = self.translateToMouseGeneID(self.species, db_trait.geneid)
+ addLiteratureCorr = True
+
+ #XZ, 26/09/2008: Method is 1 or 2. Have NOT fetched literature corr and tissue corr yet.
+ # Phenotype data will not have geneid, and neither will some probes
+ # we need to handle this because we will get an attribute error
+ else:
+ if self.input_trait_mouse_gene_id and self.db.type=="ProbeSet":
+ addLiteratureCorr = True
+ if self.trait_symbol and self.db.type=="ProbeSet":
+ addTissueCorr = True
+
+ trait_list.append(db_trait)
+
+ if addLiteratureCorr:
+ trait_list = self.getLiteratureCorrelationByList(self.input_trait_mouse_gene_id,
+ self.species, trait_list)
+ if addTissueCorr:
+ trait_list = self.getTissueCorrelationByList(
+ primaryTraitSymbol = self.trait_symbol,
+ traitList = trait_list,
+ TissueProbeSetFreezeId = TISSUE_MOUSE_DB,
+ method=self.method)
+
+ return trait_list
+ """
+
def do_tissue_corr_for_all_traits_2(self):
"""Comments Possibly Out of Date!!!!!
@@ -670,51 +789,17 @@ class CorrelationResults(object):
# except: return False
- def get_all_dataset_data(self):
-
- """
- SELECT ProbeSet.Name, T128.value, T129.value, T130.value, T131.value, T132.value, T134.value, T135.value, T138.value, T139.value, T140.value, T141.value, T142.value, T144
- .value, T145.value, T147.value, T148.value, T149.value, T487.value, T919.value, T920.value, T922.value
- FROM (ProbeSet, ProbeSetXRef, ProbeSetFreeze)
- left join ProbeSetData as T128 on T128.Id = ProbeSetXRef.DataId and T128.StrainId=128
- left join ProbeSetData as T129 on T129.Id = ProbeSetXRef.DataId and T129.StrainId=129
- left join ProbeSetData as T130 on T130.Id = ProbeSetXRef.DataId and T130.StrainId=130
- left join ProbeSetData as T131 on T131.Id = ProbeSetXRef.DataId and T131.StrainId=131
- left join ProbeSetData as T132 on T132.Id = ProbeSetXRef.DataId and T132.StrainId=132
- left join ProbeSetData as T134 on T134.Id = ProbeSetXRef.DataId and T134.StrainId=134
- left join ProbeSetData as T135 on T135.Id = ProbeSetXRef.DataId and T135.StrainId=135
- left join ProbeSetData as T138 on T138.Id = ProbeSetXRef.DataId and T138.StrainId=138
- left join ProbeSetData as T139 on T139.Id = ProbeSetXRef.DataId and T139.StrainId=139
- left join ProbeSetData as T140 on T140.Id = ProbeSetXRef.DataId and T140.StrainId=140
- left join ProbeSetData as T141 on T141.Id = ProbeSetXRef.DataId and T141.StrainId=141
- left join ProbeSetData as T142 on T142.Id = ProbeSetXRef.DataId and T142.StrainId=142
- left join ProbeSetData as T144 on T144.Id = ProbeSetXRef.DataId and T144.StrainId=144
- left join ProbeSetData as T145 on T145.Id = ProbeSetXRef.DataId and T145.StrainId=145
- left join ProbeSetData as T147 on T147.Id = ProbeSetXRef.DataId and T147.StrainId=147
- left join ProbeSetData as T148 on T148.Id = ProbeSetXRef.DataId and T148.StrainId=148
- left join ProbeSetData as T149 on T149.Id = ProbeSetXRef.DataId and T149.StrainId=149
- left join ProbeSetData as T487 on T487.Id = ProbeSetXRef.DataId and T487.StrainId=487
- left join ProbeSetData as T919 on T919.Id = ProbeSetXRef.DataId and T919.StrainId=919
- left join ProbeSetData as T920 on T920.Id = ProbeSetXRef.DataId and T920.StrainId=920
- left join ProbeSetData as T922 on T922.Id = ProbeSetXRef.DataId and T922.StrainId=922
- WHERE ProbeSetXRef.ProbeSetFreezeId = ProbeSetFreeze.Id and
- ProbeSetFreeze.Name = 'HC_M2_0606_P' and
- ProbeSet.Id = ProbeSetXRef.ProbeSetId order by ProbeSet.Id
- """
-
def process_samples(self, start_vars, sample_names, excluded_samples=None):
if not excluded_samples:
excluded_samples = ()
for sample in sample_names:
if sample not in excluded_samples:
- value = start_vars['value:' + sample]
- if value.strip().lower() == 'x':
- self.sample_data[str(sample)] = None
- else:
- self.sample_data[str(sample)] = float(value)
-
-
+ # print("Looking for",sample,"in",start_vars)
+ value = start_vars.get('value:' + sample)
+ if value:
+ if not value.strip().lower() == 'x':
+ self.sample_data[str(sample)] = float(value)
##XZ, 12/16/2008: the input geneid is of mouse type
#def checkForLitInfo(self,geneId):
@@ -942,7 +1027,7 @@ class CorrelationResults(object):
use_tissue_corr = True
DatabaseFileName = self.getFileName( target_db_name=self.target_db_name )
- datasetFile = open(webqtlConfig.TEXTDIR+DatabaseFileName,'r')
+ datasetFile = open(webqtlConfig.CACHEDIR+DatabaseFileName,'r')
#XZ, 01/08/2009: read the first line
line = datasetFile.readline()
@@ -990,59 +1075,7 @@ class CorrelationResults(object):
totalTraits = len(traits) #XZ, 09/18/2008: total trait number
return traits
-
-
- def do_parallel_correlation(self):
- _log.info("Invoking parallel computing")
- input_line_list = datasetFile.readlines()
- _log.info("Read lines from the file")
- all_line_number = len(input_line_list)
-
- step = 1000
- job_number = math.ceil( float(all_line_number)/step )
-
- job_input_lists = []
-
- _log.info("Configuring jobs")
-
- for job_index in range( int(job_number) ):
- starti = job_index*step
- endi = min((job_index+1)*step, all_line_number)
-
- one_job_input_list = []
-
- for i in range( starti, endi ):
- one_job_input_list.append( input_line_list[i] )
-
- job_input_lists.append( one_job_input_list )
-
- _log.info("Creating pp servers")
-
- ppservers = ()
- # Creates jobserver with automatically detected number of workers
- job_server = pp.Server(ppservers=ppservers)
-
- _log.info("Done creating servers")
-
- jobs = []
- results = []
-
- _log.info("Starting parallel computation, submitting jobs")
- for one_job_input_list in job_input_lists: #pay attention to modules from outside
- jobs.append( job_server.submit(func=compute_corr, args=(nnCorr, _newvals, one_job_input_list, self.method), depfuncs=(), modules=("utility.webqtlUtil",)) )
- _log.info("Done submitting jobs")
-
- for one_job in jobs:
- one_result = one_job()
- results.append( one_result )
-
- _log.info("Acquiring results")
-
- for one_result in results:
- for one_traitinfo in one_result:
- allcorrelations.append( one_traitinfo )
-
- _log.info("Appending the results")
+
def calculate_corr_for_all_tissues(self, tissue_dataset_id=None):
symbol_corr_dict = {}
@@ -1067,10 +1100,7 @@ class CorrelationResults(object):
# SymbolValueDict)
return (symbolCorrDict, symbolPvalueDict)
- datasetFile.close()
- totalTraits = len(allcorrelations)
- _log.info("Done correlating using the fast method")
-
+
def correlate(self):
self.correlation_data = collections.defaultdict(list)
@@ -1085,107 +1115,254 @@ class CorrelationResults(object):
values_2.append(target_value)
correlation = calCorrelation(values_1, values_2)
self.correlation_data[trait] = correlation
+
+ def getFileName(self, target_db_name): ### dcrowell August 2008
+ """Returns the name of the reference database file with which correlations are calculated.
+ Takes argument cursor which is a cursor object of any instance of a subclass of templatePage
+ Used by correlationPage"""
+
+ dataset_id = str(self.target_dataset.id)
+ dataset_fullname = self.target_dataset.fullname.replace(' ','_')
+ dataset_fullname = dataset_fullname.replace('/','_')
+ FileName = 'ProbeSetFreezeId_' + dataset_id + '_FullName_' + dataset_fullname + '.txt'
- """
- correlations = []
-
- #XZ: Use the fast method only for probeset dataset, and this dataset must have been created.
- #XZ: Otherwise, use original method
- #_log.info("Entering correlation")
-
- #db_filename = self.getFileName(target_db_name=self.target_db_name)
- #
- #cache_available = db_filename in os.listdir(webqtlConfig.TEXTDIR)
-
- # If the cache file exists, do a cached correlation for probeset data
- if self.dataset.type == "ProbeSet":
-# if self.method in [METHOD_SAMPLE_PEARSON, METHOD_SAMPLE_RANK] and cache_available:
-# traits = do_parallel_correlation()
-#
-# else:
+ return FileName
+
+ def do_parallel_correlation(self, db_filename, num_overlap):
+
+ #XZ, 01/14/2009: This method is for parallel computing only.
+ #XZ: It is supposed to be called when "Genetic Correlation, Pearson's r" (method 1)
+ #XZ: or "Genetic Correlation, Spearman's rho" (method 2) is selected
+ def compute_corr(input_nnCorr, input_trait, input_list, corr_method):
+
+ import math
+ import reaper
+
+ def calCorrelation(dbdata,userdata,N):
+ X = []
+ Y = []
+ for i in range(N):
+ if (dbdata[i] != None and userdata[i] != None) and (dbdata[i] != "None" and userdata[i] != "None"):
+ X.append(float(dbdata[i]))
+ Y.append(float(userdata[i]))
+ NN = len(X)
+ if NN <6:
+ return (0.0,NN)
+ sx = reduce(lambda x,y:x+y,X,0.0)
+ sy = reduce(lambda x,y:x+y,Y,0.0)
+ meanx = sx/NN
+ meany = sy/NN
+ xyd = 0.0
+ sxd = 0.0
+ syd = 0.0
+ for i in range(NN):
+ xyd += (X[i] - meanx)*(Y[i]-meany)
+ sxd += (X[i] - meanx)*(X[i] - meanx)
+ syd += (Y[i] - meany)*(Y[i] - meany)
+ try:
+ corr = xyd/(math.sqrt(sxd)*math.sqrt(syd))
+ except:
+ corr = 0
+ return (corr,NN)
+
+ def calCorrelationRank(xVals,yVals,N):
+ """
+ Calculated Spearman Ranked Correlation. The algorithm works
+ by setting all tied ranks to the average of those ranks (for
+ example, if ranks 5-10 all have the same value, each will be set
+ to rank 7.5).
+ """
+
+ XX = []
+ YY = []
+ j = 0
+
+ for i in range(len(xVals)):
+ if (xVals[i]!= None and yVals[i]!= None) and (xVals[i] != "None" and yVals[i] != "None"):
+ XX.append((j,float(xVals[i])))
+ YY.append((j,float(yVals[i])))
+ j = j+1
+
+ NN = len(XX)
+ if NN <6:
+ return (0.0,NN)
+ XX.sort(cmpOrder2)
+ YY.sort(cmpOrder2)
+ X = [0]*NN
+ Y = [0]*NN
+
+ j = 1
+ rank = 0.0
+ t = 0.0
+ sx = 0.0
+
+ while j < NN:
+
+ if XX[j][1] != XX[j-1][1]:
+ X[XX[j-1][0]] = j
+ j = j+1
- traits = self.get_traits(self.vals)
+ else:
+ jt = j+1
+ ji = j
+ for jt in range(j+1, NN):
+ if (XX[jt][1] != XX[j-1][1]):
+ break
+ rank = 0.5*(j+jt)
+ for ji in range(j-1, jt):
+ X[XX[ji][0]] = rank
+ t = jt-j
+ sx = sx + (t*t*t-t)
+ if (jt == NN-1):
+ if (XX[jt][1] == XX[j-1][1]):
+ X[XX[NN-1][0]] = rank
+ j = jt+1
+
+ if j == NN:
+ if X[XX[NN-1][0]] == 0:
+ X[XX[NN-1][0]] = NN
+
+ j = 1
+ rank = 0.0
+ t = 0.0
+ sy = 0.0
+
+ while j < NN:
+
+ if YY[j][1] != YY[j-1][1]:
+ Y[YY[j-1][0]] = j
+ j = j+1
+ else:
+ jt = j+1
+ ji = j
+ for jt in range(j+1, NN):
+ if (YY[jt][1] != YY[j-1][1]):
+ break
+ rank = 0.5*(j+jt)
+ for ji in range(j-1, jt):
+ Y[YY[ji][0]] = rank
+ t = jt - j
+ sy = sy + (t*t*t-t)
+ if (jt == NN-1):
+ if (YY[jt][1] == YY[j-1][1]):
+ Y[YY[NN-1][0]] = rank
+ j = jt+1
+
+ if j == NN:
+ if Y[YY[NN-1][0]] == 0:
+ Y[YY[NN-1][0]] = NN
+
+ D = 0.0
+
+ for i in range(NN):
+ D += (X[i]-Y[i])*(X[i]-Y[i])
+
+ fac = (1.0 -sx/(NN*NN*NN-NN))*(1.0-sy/(NN*NN*NN-NN))
+
+ return ((1-(6.0/(NN*NN*NN-NN))*(D+(sx+sy)/12.0))/math.sqrt(fac),NN)
+
+ # allcorrelations = []
+
+ correlation_data = {}
+ for i, line in enumerate(input_list):
+ if i == 0:
+ continue
+ tokens = line.split('","')
+ tokens[-1] = tokens[-1][:-2] #remove the last "
+ tokens[0] = tokens[0][1:] #remove the first "
+
+ traitdataName = tokens[0]
+ database_trait = tokens[1:]
+
+ #print("database_trait:", database_trait)
+
+ #ZS: 2015 could add biweight correlation, see http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3465711/
+ # if corr_method == 'pearson':
+ # sample_r, sample_p = scipy.stats.pearsonr(input_trait, database_trait)
+ # else:
+ # sample_r, sample_p = scipy.stats.spearmanr(input_trait, database_trait)
+
+ if corr_method == "pearson": #XZ: Pearson's r
+ sample_r, nOverlap = calCorrelation(input_trait, database_trait, input_nnCorr)
+ else: #XZ: Spearman's rho
+ sample_r, nOverlap = calCorrelationRank(input_trait, database_trait, input_nnCorr)
+
+ #XZ: calculate corrPValue
+ if nOverlap < 3:
+ sample_p = 1.0
+ else:
+ if abs(sample_r) >= 1.0:
+ sample_p = 0.0
+ else:
+ z_value = 0.5*math.log((1.0+sample_r)/(1.0-sample_r))
+ z_value = z_value*math.sqrt(nOverlap-3)
+ sample_p = 2.0*(1.0 - reaper.normp(abs(z_value)))
+
+ correlation_data[traitdataName] = [sample_r, sample_p, nOverlap]
+
+ # traitinfo = [traitdataName, sample_r, nOverlap]
+ # allcorrelations.append(traitinfo)
- for trait in traits:
- trait.calculate_correlation(vals, self.method)
+ return correlation_data
+ # return allcorrelations
+
+
+ datasetFile = open(webqtlConfig.GENERATED_TEXT_DIR+db_filename,'r')
+
+ print("Invoking parallel computing")
+ input_line_list = datasetFile.readlines()
+ print("Read lines from the file")
+ all_line_number = len(input_line_list)
- self.record_count = len(traits) #ZS: This isn't a good way to get this value, so I need to change it later
+ step = 1000
+ job_number = math.ceil( float(all_line_number)/step )
- #XZ, 3/31/2010: Theoretically, we should create one function 'comTissueCorr'
- #to compare each trait by their tissue corr p values.
- #But because the tissue corr p values are generated by permutation test,
- #the top ones always have p value 0. So comparing p values actually does nothing.
- #In addition, for the tissue data in our database, the N is always the same.
- #So it's safe to compare with tissue corr statistic value.
- #That's the same as literature corr.
- #if self.method in [METHOD_LIT, METHOD_TISSUE_PEARSON, METHOD_TISSUE_RANK] and self.gene_id:
- # traits.sort(webqtlUtil.cmpLitCorr)
- #else:
- #if self.method in TISSUE_METHODS:
- # sort(traits, key=lambda A: math.fabs(A.tissue_corr))
- #elif self.method == METHOD_LIT:
- # traits.sort(traits, key=lambda A: math.fabs(A.lit_corr))
- #else:
- traits = sortTraitCorrelations(traits, self.method)
-
- # Strip to the top N correlations
- traits = traits[:min(self.returnNumber, len(traits))]
+ print("JOB NUMBER", job_number)
+
+ job_input_lists = []
- addLiteratureCorr = False
- addTissueCorr = False
+ print("Configuring jobs")
- trait_list = []
- for trait in traits:
- db_trait = webqtlTrait(db=self.db, name=trait.name, cursor=self.cursor)
- db_trait.retrieveInfo( QTL='Yes' )
+ for job_index in range( int(job_number) ):
+ starti = job_index*step
+ endi = min((job_index+1)*step, all_line_number)
- db_trait.Name = trait.name
- db_trait.corr = trait.correlation
- db_trait.nOverlap = trait.overlap
- db_trait.corrPValue = trait.p_value
+ one_job_input_list = []
- # NL, 07/19/2010
- # js function changed, add a new parameter rankOrder for js function 'showTissueCorrPlot'
- db_trait.RANK_ORDER = self.RANK_ORDERS[self.method]
+ for i in range( starti, endi ):
+ one_job_input_list.append( input_line_list[i] )
- #XZ, 26/09/2008: Method is 4 or 5. Have fetched tissue corr, but no literature correlation yet.
- if self.method in TISSUE_METHODS:
- db_trait.tissueCorr = trait.tissue_corr
- db_trait.tissuePValue = trait.p_tissue
- addTissueCorr = True
+ job_input_lists.append( one_job_input_list )
+ print("Creating pp servers")
- #XZ, 26/09/2008: Method is 3, Have fetched literature corr, but no tissue corr yet.
- elif self.method == METHOD_LIT:
- db_trait.LCorr = trait.lit_corr
- db_trait.mouse_geneid = self.translateToMouseGeneID(self.species, db_trait.geneid)
- addLiteratureCorr = True
+ ppservers = ()
+ # Creates jobserver with automatically detected number of workers
+ job_server = pp.Server(ppservers=ppservers)
- #XZ, 26/09/2008: Method is 1 or 2. Have NOT fetched literature corr and tissue corr yet.
- # Phenotype data will not have geneid, and neither will some probes
- # we need to handle this because we will get an attribute error
- else:
- if self.input_trait_mouse_gene_id and self.db.type=="ProbeSet":
- addLiteratureCorr = True
- if self.trait_symbol and self.db.type=="ProbeSet":
- addTissueCorr = True
+ print("Done creating servers")
- trait_list.append(db_trait)
+ jobs = []
+ results = []
- if addLiteratureCorr:
- trait_list = self.getLiteratureCorrelationByList(self.input_trait_mouse_gene_id,
- self.species, trait_list)
- if addTissueCorr:
- trait_list = self.getTissueCorrelationByList(
- primaryTraitSymbol = self.trait_symbol,
- traitList = trait_list,
- TissueProbeSetFreezeId = TISSUE_MOUSE_DB,
- method=self.method)
+ print("Starting parallel computation, submitting jobs")
+ for one_job_input_list in job_input_lists: #pay attention to modules from outside
+ jobs.append( job_server.submit(func=compute_corr, args=(num_overlap, self.this_trait_vals, one_job_input_list, self.corr_method), depfuncs=(), modules=("webqtlUtil",)) )
+ print("Done submitting jobs")
- return trait_list
- """
+ for one_job in jobs:
+ one_result = one_job()
+ self.correlation_data.update(one_result)
+ # one_result = one_job()
+ # results.append( one_result )
+ #print("CORRELATION DATA:", self.correlation_data)
+
+ # print("Acquiring results")
+ # for one_result in results:
+ # for one_traitinfo in one_result:
+ # allcorrelations.append( one_traitinfo )
diff --git a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py
index 6bc0ef77..f74e655d 100755
--- a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py
+++ b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py
@@ -43,7 +43,6 @@ from pprint import pformat as pf
from htmlgen import HTMLgen2 as HT
import reaper
-from base import webqtlConfig
from utility.THCell import THCell
from utility.TDCell import TDCell
from base.trait import GeneralTrait
diff --git a/wqflask/wqflask/ctl/__init__.py b/wqflask/wqflask/ctl/__init__.py
new file mode 100755
index 00000000..e69de29b
--- /dev/null
+++ b/wqflask/wqflask/ctl/__init__.py
diff --git a/wqflask/wqflask/ctl/ctl_analysis.py b/wqflask/wqflask/ctl/ctl_analysis.py
new file mode 100644
index 00000000..7a42b2f8
--- /dev/null
+++ b/wqflask/wqflask/ctl/ctl_analysis.py
@@ -0,0 +1,194 @@
+# CTL analysis for GN2
+# Author / Maintainer: Danny Arends <Danny.Arends@gmail.com>
+import sys
+from numpy import *
+import scipy as sp # SciPy
+import rpy2.robjects as ro # R Objects
+import rpy2.rinterface as ri
+
+from base.webqtlConfig import GENERATED_IMAGE_DIR
+from utility import webqtlUtil # Random number for the image
+from utility import genofile_parser # genofile_parser
+
+import base64
+import array
+import csv
+import itertools
+
+from base import data_set
+from base import trait as TRAIT
+
+from utility import helper_functions
+from utility.tools import locate
+
+from rpy2.robjects.packages import importr
+utils = importr("utils")
+
+## Get pointers to some common R functions
+r_library = ro.r["library"] # Map the library function
+r_options = ro.r["options"] # Map the options function
+r_read_csv = ro.r["read.csv"] # Map the read.csv function
+r_dim = ro.r["dim"] # Map the dim function
+r_c = ro.r["c"] # Map the c function
+r_t = ro.r["t"] # Map the t function
+r_cat = ro.r["cat"] # Map the cat function
+r_paste = ro.r["paste"] # Map the paste function
+r_unlist = ro.r["unlist"] # Map the unlist function
+r_head = ro.r["head"] # Map the unlist function
+r_unique = ro.r["unique"] # Map the unique function
+r_length = ro.r["length"] # Map the length function
+r_unlist = ro.r["unlist"] # Map the unlist function
+r_list = ro.r.list # Map the list function
+r_matrix = ro.r.matrix # Map the matrix function
+r_seq = ro.r["seq"] # Map the seq function
+r_table = ro.r["table"] # Map the table function
+r_names = ro.r["names"] # Map the names function
+r_sink = ro.r["sink"] # Map the sink function
+r_is_NA = ro.r["is.na"] # Map the is.na function
+r_file = ro.r["file"] # Map the file function
+r_png = ro.r["png"] # Map the png function for plotting
+r_dev_off = ro.r["dev.off"] # Map the dev.off function
+r_save_image = ro.r["save.image"] # Map the save.image function
+r_class = ro.r["class"] # Map the class function
+r_save = ro.r["save"] # Map the save function
+r_write_table = ro.r["write.table"] # Map the write.table function
+r_read_table = ro.r["read.table"] # Map the read.table function
+r_as_data_frame = ro.r["as.data.frame"] # Map the write.table function
+r_data_frame = ro.r["data.frame"] # Map the write.table function
+r_as_numeric = ro.r["as.numeric"] # Map the write.table function
+
+class CTL(object):
+ def __init__(self):
+ print("Initialization of CTL")
+ #log = r_file("/tmp/genenetwork_ctl.log", open = "wt")
+ #r_sink(log) # Uncomment the r_sink() commands to log output from stdout/stderr to a file
+ #r_sink(log, type = "message")
+ r_library("ctl") # Load CTL - Should only be done once, since it is quite expensive
+ r_options(stringsAsFactors = False)
+ print("Initialization of CTL done, package loaded in R session")
+ self.r_CTLscan = ro.r["CTLscan"] # Map the CTLscan function
+ self.r_CTLsignificant = ro.r["CTLsignificant"] # Map the CTLsignificant function
+ self.r_lineplot = ro.r["ctl.lineplot"] # Map the ctl.lineplot function
+ self.r_CTLsignificant = ro.r["CTLsignificant"] # Map the CTLsignificant function
+ self.r_CTLnetwork = ro.r["CTLnetwork"] # Map the CTLnetwork function
+ self.r_CTLprofiles = ro.r["CTLprofiles"] # Map the CTLprofiles function
+ self.r_plotCTLobject = ro.r["plot.CTLobject"] # Map the CTLsignificant function
+ print("Obtained pointers to CTL functions")
+
+ def run_analysis(self, requestform):
+ print("Starting CTL analysis on dataset")
+ self.trait_db_list = [trait.strip() for trait in requestform['trait_list'].split(',')]
+ self.trait_db_list = [x for x in self.trait_db_list if x]
+
+ print("strategy:", requestform.get("strategy"))
+ strategy = requestform.get("strategy")
+
+ print("nperm:", requestform.get("nperm"))
+ nperm = int(requestform.get("nperm"))
+
+ print("parametric:", requestform.get("parametric"))
+ parametric = bool(requestform.get("parametric"))
+
+ print("significance:", requestform.get("significance"))
+ significance = float(requestform.get("significance"))
+
+ # Get the name of the .geno file belonging to the first phenotype
+ datasetname = self.trait_db_list[0].split(":")[1]
+ dataset = data_set.create_dataset(datasetname)
+
+ genofilelocation = locate(dataset.group.name + ".geno", "genotype")
+ parser = genofile_parser.ConvertGenoFile(genofilelocation)
+ parser.process_csv()
+
+ # Create a genotype matrix
+ individuals = parser.individuals
+ markers = []
+ markernames = []
+ for marker in parser.markers:
+ markernames.append(marker["name"])
+ markers.append(marker["genotypes"])
+
+ genotypes = list(itertools.chain(*markers))
+ print(len(genotypes) / len(individuals), "==", len(parser.markers))
+
+ rGeno = r_t(ro.r.matrix(r_unlist(genotypes), nrow=len(markernames), ncol=len(individuals), dimnames = r_list(markernames, individuals), byrow=True))
+
+ # Create a phenotype matrix
+ traits = []
+ for trait in self.trait_db_list:
+ print("retrieving data for", trait)
+ if trait != "":
+ ts = trait.split(':')
+ gt = TRAIT.GeneralTrait(name = ts[0], dataset_name = ts[1])
+ gt.retrieve_sample_data(individuals)
+ for ind in individuals:
+ if ind in gt.data.keys():
+ traits.append(gt.data[ind].value)
+ else:
+ traits.append("-999")
+
+ rPheno = r_t(ro.r.matrix(r_as_numeric(r_unlist(traits)), nrow=len(self.trait_db_list), ncol=len(individuals), dimnames = r_list(self.trait_db_list, individuals), byrow=True))
+
+ # Use a data frame to store the objects
+ rPheno = r_data_frame(rPheno)
+ rGeno = r_data_frame(rGeno)
+
+ # Debug: Print the genotype and phenotype files to disk
+ #r_write_table(rGeno, "~/outputGN/geno.csv")
+ #r_write_table(rPheno, "~/outputGN/pheno.csv")
+
+ # Perform the CTL scan
+ res = self.r_CTLscan(rGeno, rPheno, strategy = strategy, nperm = nperm, parametric = parametric, ncores = 6)
+
+ # Get significant interactions
+ significant = self.r_CTLsignificant(res, significance = significance)
+
+ # Create an image for output
+ self.results = {}
+ self.results['imgurl1'] = webqtlUtil.genRandStr("CTLline_") + ".png"
+ self.results['imgloc1'] = GENERATED_IMAGE_DIR + self.results['imgurl1']
+
+ self.results['ctlresult'] = significant
+ self.results['requestform'] = requestform # Store the user specified parameters for the output page
+
+ # Create the lineplot
+ r_png(self.results['imgloc1'], width=1000, height=600, type='cairo-png')
+ self.r_lineplot(res, significance = significance)
+ r_dev_off()
+
+ n = 2
+ for trait in self.trait_db_list:
+ # Create the QTL like CTL plots
+ self.results['imgurl' + str(n)] = webqtlUtil.genRandStr("CTL_") + ".png"
+ self.results['imgloc' + str(n)] = GENERATED_IMAGE_DIR + self.results['imgurl' + str(n)]
+ r_png(self.results['imgloc' + str(n)], width=1000, height=600, type='cairo-png')
+ self.r_plotCTLobject(res, (n-1), significance = significance, main='Phenotype ' + trait)
+ r_dev_off()
+ n = n + 1
+
+ # Flush any output from R
+ sys.stdout.flush()
+
+ def loadImage(self, path, name):
+ print("pre-loading imgage results:", self.results[path])
+ imgfile = open(self.results[path], 'rb')
+ imgdata = imgfile.read()
+ imgB64 = imgdata.encode("base64")
+ bytesarray = array.array('B', imgB64)
+ self.results[name] = bytesarray
+
+ def render_image(self, results):
+ self.loadImage("imgloc1", "imgdata1")
+ n = 2
+ for trait in self.trait_db_list:
+ self.loadImage("imgloc" + str(n), "imgdata" + str(n))
+ n = n + 1
+
+ def process_results(self, results):
+ print("Processing CTL output")
+ template_vars = {}
+ template_vars["results"] = self.results
+ self.render_image(self.results)
+ sys.stdout.flush()
+ return(dict(template_vars))
+
diff --git a/wqflask/wqflask/database.py b/wqflask/wqflask/database.py
index 159c5d6c..2f544d44 100755
--- a/wqflask/wqflask/database.py
+++ b/wqflask/wqflask/database.py
@@ -24,8 +24,9 @@ def init_db():
# you will have to import them first before calling init_db()
#import yourapplication.models
import wqflask.model
- print("Creating all..")
+ print("database.py: Creating all model metadata..")
Base.metadata.create_all(bind=engine)
- print("Done creating all...")
+ print("database.py: Done creating all model metadata...")
+ print("Point your browser at http://localhost:5003/")
init_db()
diff --git a/wqflask/wqflask/do_search.py b/wqflask/wqflask/do_search.py
index a6f9c949..0e2dd27a 100755
--- a/wqflask/wqflask/do_search.py
+++ b/wqflask/wqflask/do_search.py
@@ -171,6 +171,7 @@ class MrnaAssaySearch(DoSearch):
WHERE %s
and ProbeSet.Id = ProbeSetXRef.ProbeSetId
and ProbeSetXRef.ProbeSetFreezeId = %s
+ ORDER BY ProbeSet.symbol ASC
""" % (escape(from_clause),
where_clause,
escape(str(self.dataset.id))))
@@ -192,6 +193,7 @@ class MrnaAssaySearch(DoSearch):
WHERE %s
and ProbeSet.Id = ProbeSetXRef.ProbeSetId
and ProbeSetXRef.ProbeSetFreezeId = %s
+ ORDER BY ProbeSet.symbol ASC
""" % (escape(from_clause),
where_clause,
escape(str(self.dataset.id))))
@@ -205,7 +207,7 @@ class MrnaAssaySearch(DoSearch):
print("Running ProbeSetSearch")
where_clause = self.get_where_clause()
- query = self.base_query + "WHERE " + where_clause
+ query = self.base_query + "WHERE " + where_clause + "ORDER BY ProbeSet.symbol ASC"
#print("final query is:", pf(query))
diff --git a/wqflask/wqflask/gsearch.py b/wqflask/wqflask/gsearch.py
index cb42980c..4cd3874c 100755..100644
--- a/wqflask/wqflask/gsearch.py
+++ b/wqflask/wqflask/gsearch.py
@@ -5,88 +5,90 @@ from base.data_set import create_dataset
from base.trait import GeneralTrait
from dbFunction import webqtlDatabaseFunction
+from utility.benchmark import Bench
+
class GSearch(object):
- def __init__(self, kw):
- self.type = kw['type']
- self.terms = kw['terms']
- if self.type == "gene":
- sql = """
- SELECT
- Species.`Name` AS species_name,
- InbredSet.`Name` AS inbredset_name,
- Tissue.`Name` AS tissue_name,
- ProbeSetFreeze.Name AS probesetfreeze_name,
- ProbeSet.Name AS probeset_name,
- ProbeSet.Symbol AS probeset_symbol,
- ProbeSet.`description` AS probeset_description,
- ProbeSet.Chr AS chr,
- ProbeSet.Mb AS mb,
- ProbeSetXRef.Mean AS mean,
- ProbeSetXRef.LRS AS lrs,
- ProbeSetXRef.`Locus` AS locus,
- ProbeSetXRef.`pValue` AS pvalue,
- ProbeSetXRef.`additive` AS additive
- FROM Species, InbredSet, ProbeSetXRef, ProbeSet, ProbeFreeze, ProbeSetFreeze, Tissue
- WHERE InbredSet.`SpeciesId`=Species.`Id`
- AND ProbeFreeze.InbredSetId=InbredSet.`Id`
- AND ProbeFreeze.`TissueId`=Tissue.`Id`
- AND ProbeSetFreeze.ProbeFreezeId=ProbeFreeze.Id
- AND ( MATCH (ProbeSet.Name,ProbeSet.description,ProbeSet.symbol,alias,GenbankId, UniGeneId, Probe_Target_Description) AGAINST ('%s' IN BOOLEAN MODE) )
- AND ProbeSet.Id = ProbeSetXRef.ProbeSetId
- AND ProbeSetXRef.ProbeSetFreezeId=ProbeSetFreeze.Id
- AND ProbeSetFreeze.public > 0
- ORDER BY species_name, inbredset_name, tissue_name, probesetfreeze_name, probeset_name
- LIMIT 5000
- """ % (self.terms)
- re = g.db.execute(sql).fetchall()
- self.trait_list = []
- for line in re:
- dataset = create_dataset(line[3], "ProbeSet")
- trait_id = line[4]
- this_trait = GeneralTrait(dataset=dataset, name=trait_id, get_qtl_info=True)
- self.trait_list.append(this_trait)
- species = webqtlDatabaseFunction.retrieve_species(dataset.group.name)
- dataset.get_trait_info([this_trait], species)
+ def __init__(self, kw):
+ self.type = kw['type']
+ self.terms = kw['terms']
+ if self.type == "gene":
+ sql = """
+ SELECT
+ Species.`Name` AS species_name,
+ InbredSet.`Name` AS inbredset_name,
+ Tissue.`Name` AS tissue_name,
+ ProbeSetFreeze.Name AS probesetfreeze_name,
+ ProbeSet.Name AS probeset_name,
+ ProbeSet.Symbol AS probeset_symbol,
+ ProbeSet.`description` AS probeset_description,
+ ProbeSet.Chr AS chr,
+ ProbeSet.Mb AS mb,
+ ProbeSetXRef.Mean AS mean,
+ ProbeSetXRef.LRS AS lrs,
+ ProbeSetXRef.`Locus` AS locus,
+ ProbeSetXRef.`pValue` AS pvalue,
+ ProbeSetXRef.`additive` AS additive
+ FROM Species, InbredSet, ProbeSetXRef, ProbeSet, ProbeFreeze, ProbeSetFreeze, Tissue
+ WHERE InbredSet.`SpeciesId`=Species.`Id`
+ AND ProbeFreeze.InbredSetId=InbredSet.`Id`
+ AND ProbeFreeze.`TissueId`=Tissue.`Id`
+ AND ProbeSetFreeze.ProbeFreezeId=ProbeFreeze.Id
+ AND ( MATCH (ProbeSet.Name,ProbeSet.description,ProbeSet.symbol,alias,GenbankId, UniGeneId, Probe_Target_Description) AGAINST ('%s' IN BOOLEAN MODE) )
+ AND ProbeSet.Id = ProbeSetXRef.ProbeSetId
+ AND ProbeSetXRef.ProbeSetFreezeId=ProbeSetFreeze.Id
+ AND ProbeSetFreeze.public > 0
+ ORDER BY species_name, inbredset_name, tissue_name, probesetfreeze_name, probeset_name
+ LIMIT 6000
+ """ % (self.terms)
+ with Bench("Running query"):
+ re = g.db.execute(sql).fetchall()
+ self.trait_list = []
+ with Bench("Creating trait objects"):
+ for line in re:
+ dataset = create_dataset(line[3], "ProbeSet", get_samplelist=False)
+ trait_id = line[4]
+ #with Bench("Building trait object"):
+ this_trait = GeneralTrait(dataset=dataset, name=trait_id, get_qtl_info=True, get_sample_info=False)
+ self.trait_list.append(this_trait)
- elif self.type == "phenotype":
- sql = """
- SELECT
- Species.`Name`,
- InbredSet.`Name`,
- PublishFreeze.`Name`,
- PublishXRef.`Id`,
- Phenotype.`Post_publication_description`,
- Publication.`Authors`,
- Publication.`Year`,
- PublishXRef.`LRS`,
- PublishXRef.`Locus`,
- PublishXRef.`additive`
- FROM Species,InbredSet,PublishFreeze,PublishXRef,Phenotype,Publication
- WHERE PublishXRef.`InbredSetId`=InbredSet.`Id`
- AND PublishFreeze.`InbredSetId`=InbredSet.`Id`
- AND InbredSet.`SpeciesId`=Species.`Id`
- AND PublishXRef.`PhenotypeId`=Phenotype.`Id`
- AND PublishXRef.`PublicationId`=Publication.`Id`
- AND (Phenotype.Post_publication_description REGEXP "[[:<:]]%s[[:>:]]"
- OR Phenotype.Pre_publication_description REGEXP "[[:<:]]%s[[:>:]]"
- OR Phenotype.Pre_publication_abbreviation REGEXP "[[:<:]]%s[[:>:]]"
- OR Phenotype.Post_publication_abbreviation REGEXP "[[:<:]]%s[[:>:]]"
- OR Phenotype.Lab_code REGEXP "[[:<:]]%s[[:>:]]"
- OR Publication.PubMed_ID REGEXP "[[:<:]]%s[[:>:]]"
- OR Publication.Abstract REGEXP "[[:<:]]%s[[:>:]]"
- OR Publication.Title REGEXP "[[:<:]]%s[[:>:]]"
- OR Publication.Authors REGEXP "[[:<:]]%s[[:>:]]"
- OR PublishXRef.Id REGEXP "[[:<:]]%s[[:>:]]")
- ORDER BY Species.`Name`, InbredSet.`Name`, PublishXRef.`Id`
- LIMIT 5000
- """ % (self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms)
- re = g.db.execute(sql).fetchall()
- self.trait_list = []
- for line in re:
- dataset = create_dataset(line[2], "Publish")
- trait_id = line[3]
- this_trait = GeneralTrait(dataset=dataset, name=trait_id, get_qtl_info=True)
- self.trait_list.append(this_trait)
- species = webqtlDatabaseFunction.retrieve_species(dataset.group.name)
- dataset.get_trait_info([this_trait], species)
+ elif self.type == "phenotype":
+ sql = """
+ SELECT
+ Species.`Name`,
+ InbredSet.`Name`,
+ PublishFreeze.`Name`,
+ PublishXRef.`Id`,
+ Phenotype.`Post_publication_description`,
+ Publication.`Authors`,
+ Publication.`Year`,
+ PublishXRef.`LRS`,
+ PublishXRef.`Locus`,
+ PublishXRef.`additive`
+ FROM Species,InbredSet,PublishFreeze,PublishXRef,Phenotype,Publication
+ WHERE PublishXRef.`InbredSetId`=InbredSet.`Id`
+ AND PublishFreeze.`InbredSetId`=InbredSet.`Id`
+ AND InbredSet.`SpeciesId`=Species.`Id`
+ AND PublishXRef.`PhenotypeId`=Phenotype.`Id`
+ AND PublishXRef.`PublicationId`=Publication.`Id`
+ AND (Phenotype.Post_publication_description REGEXP "[[:<:]]%s[[:>:]]"
+ OR Phenotype.Pre_publication_description REGEXP "[[:<:]]%s[[:>:]]"
+ OR Phenotype.Pre_publication_abbreviation REGEXP "[[:<:]]%s[[:>:]]"
+ OR Phenotype.Post_publication_abbreviation REGEXP "[[:<:]]%s[[:>:]]"
+ OR Phenotype.Lab_code REGEXP "[[:<:]]%s[[:>:]]"
+ OR Publication.PubMed_ID REGEXP "[[:<:]]%s[[:>:]]"
+ OR Publication.Abstract REGEXP "[[:<:]]%s[[:>:]]"
+ OR Publication.Title REGEXP "[[:<:]]%s[[:>:]]"
+ OR Publication.Authors REGEXP "[[:<:]]%s[[:>:]]"
+ OR PublishXRef.Id REGEXP "[[:<:]]%s[[:>:]]")
+ ORDER BY Species.`Name`, InbredSet.`Name`, PublishXRef.`Id`
+ LIMIT 6000
+ """ % (self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms)
+ re = g.db.execute(sql).fetchall()
+ self.trait_list = []
+ with Bench("Creating trait objects"):
+ for line in re:
+ dataset = create_dataset(line[2], "Publish")
+ trait_id = line[3]
+ this_trait = GeneralTrait(dataset=dataset, name=trait_id, get_qtl_info=True, get_sample_info=False)
+ self.trait_list.append(this_trait)
diff --git a/wqflask/wqflask/heatmap/heatmap.py b/wqflask/wqflask/heatmap/heatmap.py
index 40f518f0..19c330eb 100644
--- a/wqflask/wqflask/heatmap/heatmap.py
+++ b/wqflask/wqflask/heatmap/heatmap.py
@@ -26,13 +26,12 @@ import reaper
from base.trait import GeneralTrait
from base import data_set
from base import species
-from base import webqtlConfig
-from utility import webqtlUtil
# from wqflask.my_pylmm.pyLMM import lmm
# from wqflask.my_pylmm.pyLMM import input
from utility import helper_functions
from utility import Plot, Bunch
from utility import temp_data
+from utility.tools import PYLMM_COMMAND
from MySQLdb import escape_string as escape
@@ -137,7 +136,7 @@ class Heatmap(object):
this_trait = trait_db[0]
#this_db = trait_db[1]
genotype = self.dataset.group.read_genotype_file()
- samples, values, variances = this_trait.export_informative()
+ samples, values, variances, sample_aliases = this_trait.export_informative()
trimmed_samples = []
trimmed_values = []
@@ -214,7 +213,7 @@ class Heatmap(object):
#Redis.expire(key, 60*60)
#print("before printing command")
#
- #command = 'python /home/zas1024/gene/wqflask/wqflask/my_pylmm/pyLMM/lmm.py --key {} --species {}'.format(key,
+ #command = 'python lmm.py --key {} --species {}'.format(key,
# "other")
#print("command is:", command)
#print("after printing command")
@@ -273,7 +272,7 @@ class Heatmap(object):
Redis.expire(key, 60*60)
print("before printing command")
- command = 'python /home/zas1024/gene/wqflask/wqflask/my_pylmm/pyLMM/lmm.py --key {} --species {}'.format(key,
+ command = PYLMM_COMMAND+' --key {} --species {}'.format(key,
"other")
print("command is:", command)
print("after printing command")
diff --git a/wqflask/wqflask/interval_analyst/GeneUtil.py b/wqflask/wqflask/interval_analyst/GeneUtil.py
index 43008ecf..a8a48786 100755..100644
--- a/wqflask/wqflask/interval_analyst/GeneUtil.py
+++ b/wqflask/wqflask/interval_analyst/GeneUtil.py
@@ -1,46 +1,24 @@
-# Copyright (C) University of Tennessee Health Science Center, Memphis, TN.
-#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU Affero General Public License
-# as published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the GNU Affero General Public License for more details.
-#
-# This program is available from Source Forge: at GeneNetwork Project
-# (sourceforge.net/projects/genenetwork/).
-#
-# Contact Drs. Robert W. Williams and Xiaodong Zhou (2010)
-# at rwilliams@uthsc.edu and xzhou15@uthsc.edu
-#
-#
-#
-# This module is used by GeneNetwork project (www.genenetwork.org)
-#
-# Created by GeneNetwork Core Team 2010/08/10
-#
-# Last updated by GeneNetwork Core Team 2010/10/20
+from __future__ import absolute_import, print_function, division
import string
+from flask import Flask, g
+
#Just return a list of dictionaries
#each dictionary contains sub-dictionary
-def loadGenes(cursor, chrName, diffCol, startMb, endMb, webqtlDb =None, species='mouse'):
- #cursor.execute("desc GeneList")
- #results = cursor.fetchall()
- #fetchFields = map(lambda X:X[0], results)
+def loadGenes(chrName, diffCol, startMb, endMb, webqtlDb =None, species='mouse'):
fetchFields = ['SpeciesId', 'Id', 'GeneSymbol', 'GeneDescription', 'Chromosome', 'TxStart', 'TxEnd',
'Strand', 'GeneID', 'NM_ID', 'kgID', 'GenBankID', 'UnigenID', 'ProteinID', 'AlignID',
'exonCount', 'exonStarts', 'exonEnds', 'cdsStart', 'cdsEnd']
##List All Species in the Gene Table
speciesDict = {}
- cursor.execute("select Species.Name, GeneList.SpeciesId from Species, GeneList where \
- GeneList.SpeciesId = Species.Id group by GeneList.SpeciesId")
- results = cursor.fetchall()
+ results = g.db.execute("""
+ SELECT Species.Name, GeneList.SpeciesId
+ FROM Species, GeneList
+ WHERE GeneList.SpeciesId = Species.Id
+ GROUP BY GeneList.SpeciesId""").fetchall()
+
for item in results:
speciesDict[item[0]] = item[1]
@@ -49,14 +27,17 @@ def loadGenes(cursor, chrName, diffCol, startMb, endMb, webqtlDb =None, species=
otherSpecies = map(lambda X: [X, speciesDict[X]], speciesDict.keys())
otherSpecies.remove([species, speciesId])
- cursor.execute("""SELECT %s from GeneList
- where
- SpeciesId = %d AND Chromosome = '%s' AND
- ((TxStart > %f and TxStart <= %f) OR (TxEnd > %f and TxEnd <= %f))
- order by txStart
- """
- % (string.join(fetchFields, ", "), speciesId, chrName, startMb, endMb, startMb, endMb))
- results = cursor.fetchall()
+ results = g.db.execute("""
+ SELECT %s FROM GeneList
+ WHERE SpeciesId = %d AND
+ Chromosome = '%s' AND
+ ((TxStart > %f and TxStart <= %f) OR (TxEnd > %f and TxEnd <= %f))
+ ORDER BY txStart
+ """ % (string.join(fetchFields, ", "),
+ speciesId, chrName,
+ startMb, endMb,
+ startMb, endMb)).fetchall()
+
GeneList = []
if results:
@@ -66,14 +47,13 @@ def loadGenes(cursor, chrName, diffCol, startMb, endMb, webqtlDb =None, species=
newdict[item] = result[j]
#count SNPs if possible
if diffCol and species=='mouse':
- cursor.execute("""
- select
- count(*) from BXDSnpPosition
- where
- Chr = '%s' AND Mb >= %2.6f AND Mb < %2.6f AND
- StrainId1 = %d AND StrainId2 = %d
- """ % (chrName, newdict["TxStart"], newdict["TxEnd"], diffCol[0], diffCol[1]))
- newdict["snpCount"] = cursor.fetchone()[0]
+ newdict["snpCount"] = g.db.execute("""
+ SELECT count(*)
+ FROM BXDSnpPosition
+ WHERE Chr = '%s' AND
+ Mb >= %2.6f AND Mb < %2.6f AND
+ StrainId1 = %d AND StrainId2 = %d
+ """ % (chrName, newdict["TxStart"], newdict["TxEnd"], diffCol[0], diffCol[1])).fetchone()[0]
newdict["snpDensity"] = newdict["snpCount"]/(newdict["TxEnd"]-newdict["TxStart"])/1000.0
else:
newdict["snpDensity"] = newdict["snpCount"] = 0
@@ -88,24 +68,24 @@ def loadGenes(cursor, chrName, diffCol, startMb, endMb, webqtlDb =None, species=
othSpec, othSpecId = item
newdict2 = {}
- cursor.execute("SELECT %s from GeneList where SpeciesId = %d and geneSymbol= '%s' limit 1" %
- (string.join(fetchFields, ", "), othSpecId, newdict["GeneSymbol"]))
- resultsOther = cursor.fetchone()
+ resultsOther = g.db.execute("SELECT %s FROM GeneList WHERE SpeciesId = %d AND geneSymbol= '%s' LIMIT 1" % (string.join(fetchFields, ", "),
+ othSpecId,
+ newdict["GeneSymbol"])).fetchone()
+
if resultsOther:
for j, item in enumerate(fetchFields):
newdict2[item] = resultsOther[j]
#count SNPs if possible, could be a separate function
if diffCol and othSpec == 'mouse':
- cursor.execute("""
- select
- count(*) from BXDSnpPosition
- where
- Chr = '%s' AND Mb >= %2.6f AND Mb < %2.6f AND
- StrainId1 = %d AND StrainId2 = %d
- """ % (chrName, newdict["TxStart"], newdict["TxEnd"], diffCol[0], diffCol[1]))
+ newdict2["snpCount"] = g.db.execute("""
+ SELECT count(*)
+ FROM BXDSnpPosition
+ WHERE Chr = '%s' AND
+ Mb >= %2.6f AND Mb < %2.6f AND
+ StrainId1 = %d AND StrainId2 = %d
+ """ % (chrName, newdict["TxStart"], newdict["TxEnd"], diffCol[0], diffCol[1])).fetchone()[0]
- newdict2["snpCount"] = cursor.fetchone()[0]
newdict2["snpDensity"] = newdict2["snpCount"]/(newdict2["TxEnd"]-newdict2["TxStart"])/1000.0
else:
newdict2["snpDensity"] = newdict2["snpCount"] = 0
diff --git a/wqflask/wqflask/interval_analyst/IntervalAnalystPage.py b/wqflask/wqflask/interval_analyst/IntervalAnalystPage.py
index ec9aa29c..f45ec0c4 100755
--- a/wqflask/wqflask/interval_analyst/IntervalAnalystPage.py
+++ b/wqflask/wqflask/interval_analyst/IntervalAnalystPage.py
@@ -45,40 +45,40 @@ class IntervalAnalystPage(templatePage):
#A dictionary that lets us map the html form names "txStart_mm6" -> "Mb Start (mm8)"
#the first item is the short name (column headers) and the second item is the long name (dropdown list)
# [short name, long name, category]
- columnNames = {"GeneSymbol" : ["Gene", "Gene Name", 'gene'],
+ columnNames = {"GeneSymbol" : ["Gene", "Gene Name", 'gene'],
"GeneDescription" : ["Description", "Gene Description", 'species'],
- 'GeneNeighborsCount' : ["Neighbors", "Gene Neighbors", 'gene'],
- 'GeneNeighborsRange' : ["Neighborhood", "Gene Neighborhood (Mb)", 'gene'],
- 'GeneNeighborsDensity' : ["Gene Density", "Gene Density (Neighbors/Mb)", 'gene'],
+ 'GeneNeighborsCount' : ["Neighbors", "Gene Neighbors", 'gene'],
+ 'GeneNeighborsRange' : ["Neighborhood", "Gene Neighborhood (Mb)", 'gene'],
+ 'GeneNeighborsDensity' : ["Gene Density", "Gene Density (Neighbors/Mb)", 'gene'],
"ProteinID" : ["Prot ID", "Protein ID", 'protein'],
- "Chromosome" : ["Chr", "Chromosome", 'species'],
- "TxStart" : ["Start", "Mb Start", 'species'],
- "TxEnd" : ["End", "Mb End", 'species'],
- "GeneLength" : ["Length", "Kb Length", 'species'],
- "cdsStart" : ["CDS Start", "Mb CDS Start", 'species'],
+ "Chromosome" : ["Chr", "Chromosome", 'species'],
+ "TxStart" : ["Start", "Mb Start", 'species'],
+ "TxEnd" : ["End", "Mb End", 'species'],
+ "GeneLength" : ["Length", "Kb Length", 'species'],
+ "cdsStart" : ["CDS Start", "Mb CDS Start", 'species'],
"cdsEnd" : ["CDS End", "Mb CDS End", 'species'],
- "exonCount" : ["Num Exons", "Exon Count", 'species'],
- "exonStarts" : ["Exon Starts", "Exon Starts", 'species'],
- "exonEnds" : ["Exon Ends", "Exon Ends", 'species'],
- "Strand" : ["Strand", "Strand", 'species'],
+ "exonCount" : ["Num Exons", "Exon Count", 'species'],
+ "exonStarts" : ["Exon Starts", "Exon Starts", 'species'],
+ "exonEnds" : ["Exon Ends", "Exon Ends", 'species'],
+ "Strand" : ["Strand", "Strand", 'species'],
"GeneID" : ["Gene ID", "Gene ID", 'species'],
- "GenBankID" : ["GenBank", "GenBank ID", 'species'],
+ "GenBankID" : ["GenBank", "GenBank ID", 'species'],
"UnigenID" : ["Unigen", "Unigen ID", 'species'],
- "NM_ID" : ["NM ID", "NM ID", 'species'],
+ "NM_ID" : ["NM ID", "NM ID", 'species'],
"kgID" : ["kg ID", "kg ID", 'species'],
- "snpCount" : ["SNPs", "SNP Count", 'species'],
- "snpDensity" : ["SNP Density", "SNP Density", 'species'],
- "lrs" : ["LRS", "Likelihood Ratio Statistic", 'misc'],
- "lod" : ["LOD", "Likelihood Odds Ratio", 'misc'],
- "pearson" : ["Pearson", "Pearson Product Moment", 'misc'],
- "literature" : ["Lit Corr", "Literature Correlation", 'misc'],
+ "snpCount" : ["SNPs", "SNP Count", 'species'],
+ "snpDensity" : ["SNP Density", "SNP Density", 'species'],
+ "lrs" : ["LRS", "Likelihood Ratio Statistic", 'misc'],
+ "lod" : ["LOD", "Likelihood Odds Ratio", 'misc'],
+ "pearson" : ["Pearson", "Pearson Product Moment", 'misc'],
+ "literature" : ["Lit Corr", "Literature Correlation", 'misc'],
}
###Species Freeze
speciesFreeze = {'mouse':'mm9', 'rat':'rn3', 'human':'hg19'}
for key in speciesFreeze.keys():
speciesFreeze[speciesFreeze[key]] = key
-
+
def __init__(self, fd):
templatePage.__init__(self, fd)
@@ -86,7 +86,7 @@ class IntervalAnalystPage(templatePage):
fd.formdata['remote_ip'] = fd.remote_ip
if not self.openMysql():
return
-
+
self.species = fd.formdata.getvalue("species", "mouse")
try:
self.startMb = float(fd.formdata.getvalue("startMb"))
@@ -96,7 +96,7 @@ class IntervalAnalystPage(templatePage):
self.endMb = float(fd.formdata.getvalue("endMb"))
except:
self.endMb = self.startMb + 10
-
+
self.Chr = fd.formdata.getvalue("chromosome", "1")
self.xls = fd.formdata.getvalue("xls", "1")
try:
@@ -107,38 +107,38 @@ class IntervalAnalystPage(templatePage):
self.diffColDefault = self.diffCol = []
if self.species != 'mouse':
self.diffColDefault = [2, 3]#default is B6 and D2 for other species
-
+
controlFrm, dispFields = self.genControlForm(fd)
geneTable, filename = self.genGeneTable(fd, dispFields)
-
+
infoTD = HT.TD(width=400, valign= "top")
- infoTD.append(HT.Paragraph("Interval Analyst : Chr %s" % self.Chr, Class="title"),
- HT.Strong("Species : "), self.species.title(), HT.BR(),
- HT.Strong("Database : "), "UCSC %s" % self.speciesFreeze[self.species], HT.BR(),
- HT.Strong("Range : "), "%2.6f Mb - %2.6f Mb" % (self.startMb, self.endMb), HT.BR(),
+ infoTD.append(HT.Paragraph("Interval Analyst : Chr %s" % self.Chr, Class="title"),
+ HT.Strong("Species : "), self.species.title(), HT.BR(),
+ HT.Strong("Database : "), "UCSC %s" % self.speciesFreeze[self.species], HT.BR(),
+ HT.Strong("Range : "), "%2.6f Mb - %2.6f Mb" % (self.startMb, self.endMb), HT.BR(),
)
if filename:
infoTD.append(HT.BR(), HT.BR(), HT.Href(text="Download", url = "/tmp/" + filename, Class="normalsize")
, " output in MS excel format.")
-
+
mainTable = HT.TableLite(HT.TR(infoTD, HT.TD(controlFrm, Class="doubleBorder", width=400), HT.TD("&nbsp;", width="")), cellpadding=10)
mainTable.append(HT.TR(HT.TD(geneTable, colspan=3)))
self.dict['body'] = HT.TD(mainTable)
self.dict['title'] = "Interval Analyst"
-
+
def genGeneTable(self, fd, dispFields):
filename = ""
if self.xls:
#import pyXLWriter as xl
filename = "IntAn_Chr%s_%2.6f-%2.6f" % (self.Chr, self.startMb, self.endMb)
filename += ".xls"
-
+
# Create a new Excel workbook
workbook = xl.Writer(os.path.join(webqtlConfig.TMPDIR, filename))
worksheet = workbook.add_worksheet()
titleStyle = workbook.add_format(align = 'left', bold = 0, size=18, border = 1, border_color="gray")
headingStyle = workbook.add_format(align = 'center', bold = 1, size=13, fg_color = 0x1E, color="white", border = 1, border_color="gray")
-
+
##Write title Info
worksheet.write([0, 0], "GeneNetwork Interval Analyst Table", titleStyle)
worksheet.write([1, 0], "%s%s" % (webqtlConfig.PORTADDR, os.path.join(webqtlConfig.CGIDIR, self._scriptfile)))
@@ -148,12 +148,12 @@ class IntervalAnalystPage(templatePage):
worksheet.write([4, 0], "Search by : %s" % fd.formdata['remote_ip'])
worksheet.write([5, 0], "view region : Chr %s %2.6f - %2.6f Mb" % (self.Chr, self.startMb, self.endMb))
nTitleRow = 7
-
+
geneTable = HT.TableLite(Class="collap", cellpadding=5)
headerRow = HT.TR(HT.TD(" ", Class="fs13 fwb ffl b1 cw cbrb", width="1"))
if self.xls:
worksheet.write([nTitleRow, 0], "Index", headingStyle)
-
+
for ncol, column in enumerate(dispFields):
if len(column) == 1:
headerRow.append(HT.TD(self.columnNames[column[0]][0], Class="fs13 fwb ffl b1 cw cbrb", NOWRAP=1,align="Center"))
@@ -162,24 +162,24 @@ class IntervalAnalystPage(templatePage):
worksheet.write([nTitleRow, ncol+1], colTitle, headingStyle)
worksheet.set_column([ncol+1, ncol+1], 2*len(colTitle))
else:
- headerRow.append(HT.TD(self.columnNames[column[0]][0], HT.BR(), " (%s)" % self.speciesFreeze[column[1]],
+ headerRow.append(HT.TD(self.columnNames[column[0]][0], HT.BR(), " (%s)" % self.speciesFreeze[column[1]],
Class="fs13 fwb ffl b1 cw cbrb", NOWRAP=1, align="Center"))
if self.xls:
colTitle = self.columnNames[column[0]][0] + " (%s)" % self.speciesFreeze[column[1]]
worksheet.write([nTitleRow, ncol+1], colTitle, headingStyle)
worksheet.set_column([ncol+1, ncol+1], 2*len(colTitle))
- #headerRow.append(HT.TD(self.columnNames[column[0]][0], HT.BR(),
- # "(%s %s)" % (column[1].title(), self.speciesFreeze[column[1]]),
+ #headerRow.append(HT.TD(self.columnNames[column[0]][0], HT.BR(),
+ # "(%s %s)" % (column[1].title(), self.speciesFreeze[column[1]]),
# Class="colorBlue", NOWRAP=1, align="Center"))
geneTable.append(headerRow)
-
+
geneCol = GeneUtil.loadGenes(self.cursor, self.Chr, self.diffColDefault, self.startMb, self.endMb, species=self.species)
for gIndex, theGO in enumerate(geneCol):
geneRow = HT.TR(HT.TD(gIndex+1, Class="fs12 fwn b1", align="right"))
if self.xls:
nTitleRow += 1
worksheet.write([nTitleRow, 0], gIndex + 1)
-
+
for ncol, column in enumerate(dispFields):
if len(column) == 1 or column[1]== self.species:
keyValue = ""
@@ -196,17 +196,17 @@ class IntervalAnalystPage(templatePage):
curGO = theGO[subGO]
if theGO[subGO].has_key(fieldName):
keyValue = theGO[subGO][fieldName]
-
+
if self.xls:
worksheet.write([nTitleRow, ncol+1], keyValue)
geneRow.append(self.formatTD(keyValue, fieldName, curSpecies, curGO))
-
+
geneTable.append(geneRow)
-
+
if self.xls:
workbook.close()
return geneTable, filename
-
+
def formatTD(self, keyValue, fieldName, Species, theGO):
if keyValue is None:
keyValue = ""
@@ -219,7 +219,7 @@ class IntervalAnalystPage(templatePage):
keyValue = ""
return HT.TD(keyValue, Class="fs12 fwn b1", width=300)
elif fieldName in ("GeneSymbol"):
- webqtlLink = HT.Href("./%s?cmd=sch&gene=%s&alias=1&species=%s" % (webqtlConfig.SCRIPTFILE, keyValue, Species),
+ webqtlLink = HT.Href("./%s?cmd=sch&gene=%s&alias=1&species=%s" % (webqtlConfig.SCRIPTFILE, keyValue, Species),
HT.Image("/images/webqtl_search.gif", border=0, valign="top"), target="_blank")
if theGO['GeneID']:
geneSymbolLink = HT.Href(webqtlConfig.NCBI_LOCUSID % theGO['GeneID'], keyValue, Class="normalsize", target="_blank")
@@ -236,8 +236,8 @@ class IntervalAnalystPage(templatePage):
return HT.TD(keyValue, Class="fs12 fwn b1",align="right")
elif fieldName in ("snpCount"):
if keyValue:
- snpString = HT.Href(url="%s&chr=%s&start=%s&end=%s&geneName=%s&s1=%d&s2=%d" % (os.path.join(webqtlConfig.CGIDIR, 'main.py?FormID=snpBrowser'),
- theGO["Chromosome"], theGO["TxStart"], theGO["TxEnd"], theGO["GeneSymbol"], self.diffColDefault[0], self.diffColDefault[1]),
+ snpString = HT.Href(url="%s&chr=%s&start=%s&end=%s&geneName=%s&s1=%d&s2=%d" % (os.path.join(webqtlConfig.CGIDIR, 'main.py?FormID=snpBrowser'),
+ theGO["Chromosome"], theGO["TxStart"], theGO["TxEnd"], theGO["GeneSymbol"], self.diffColDefault[0], self.diffColDefault[1]),
text=theGO["snpCount"], target="_blank", Class="normalsize")
else:
snpString = keyValue
@@ -252,13 +252,13 @@ class IntervalAnalystPage(templatePage):
return HT.TD(keyValue, Class="fs12 fwn b1",NOWRAP=1)
else:
return HT.TD(keyValue, Class="fs12 fwn b1",NOWRAP=1,align="right")
-
+
def genControlForm(self, fd):
##desc GeneList
self.cursor.execute("Desc GeneList")
GeneListFields = self.cursor.fetchall()
GeneListFields = map(lambda X: X[0], GeneListFields)
-
+
#group columns by category--used for creating the dropdown list of possible columns
categories = {}
for item in self.columnNames.keys():
@@ -267,7 +267,7 @@ class IntervalAnalystPage(templatePage):
categories[category[-1]] = [item ]
else:
categories[category[-1]] = categories[category[-1]]+[item]
-
+
##List All Species in the Gene Table
speciesDict = {}
self.cursor.execute("select Species.Name, GeneList.SpeciesId from Species, GeneList where \
@@ -292,34 +292,34 @@ class IntervalAnalystPage(templatePage):
pass
AppliedField.append(item2)
categories[specName] = AppliedField
-
+
categoriesOrder += ['misc']
-
+
############################################################
## Create the list of possible columns for the dropdown list
############################################################
allColumnsList = HT.Select(name="allColumns", Class="snpBrowserDropBox")
-
+
for category in categoriesOrder:
allFields = categories[category]
if allFields:
geneOpt = HT.Optgroup(label=category.title())
for item in allFields:
if category in self.speciesFreeze.keys():
- geneOpt.append(("%s (%s %s)" % (self.columnNames[item][1], category.title(), self.speciesFreeze[category]),
+ geneOpt.append(("%s (%s %s)" % (self.columnNames[item][1], category.title(), self.speciesFreeze[category]),
"%s__%s" % (item, self.speciesFreeze[category])))
else:
geneOpt.append((self.columnNames[item][1], item))
geneOpt.sort()
allColumnsList.append(geneOpt)
-
+
######################################
## Create the list of selected columns
######################################
-
+
#cols contains the value of all the selected columns
submitCols = cols = fd.formdata.getvalue("columns", "default")
-
+
if cols == "default":
if self.species=="mouse": #these are the same columns that are shown on intervalPage.py
cols = ['GeneSymbol', 'GeneDescription', 'Chromosome', 'TxStart', 'Strand', 'GeneLength', 'GeneID', 'NM_ID', 'snpCount', 'snpDensity']
@@ -331,12 +331,12 @@ class IntervalAnalystPage(templatePage):
else:
if type(cols)==type(""):
cols = [cols]
-
+
colsLst = []
dispFields = []
for column in cols:
if submitCols == "default" and column not in ('GeneSymbol') and (column in GeneListFields or column in speciesField):
- colsLst.append(("%s (%s %s)" % (self.columnNames[column][1], self.species.title(), self.speciesFreeze[self.species]),
+ colsLst.append(("%s (%s %s)" % (self.columnNames[column][1], self.species.title(), self.speciesFreeze[self.species]),
"%s__%s" % (column, self.speciesFreeze[self.species])))
dispFields.append([column, self.species])
else:
@@ -346,17 +346,17 @@ class IntervalAnalystPage(templatePage):
dispFields.append([column])
else:
thisSpecies = self.speciesFreeze[column2[1]]
- colsLst.append(("%s (%s %s)" % (self.columnNames[column2[0]][1], thisSpecies.title(), column2[1]),
+ colsLst.append(("%s (%s %s)" % (self.columnNames[column2[0]][1], thisSpecies.title(), column2[1]),
column))
dispFields.append((column2[0], thisSpecies))
selectedColumnsList = HT.Select(name="columns", Class="snpBrowserSelectBox", multiple="true", data=colsLst, size=6)
-
+
##########################
## Create the columns form
- ##########################
+ ##########################
columnsForm = HT.Form(name="columnsForm", submit=HT.Input(type='hidden'), cgi=os.path.join(webqtlConfig.CGIDIR, self._scriptfile), enctype="multipart/form-data")
columnsForm.append(HT.Input(type="hidden", name="fromdatabase", value= fd.formdata.getvalue("fromdatabase", "unknown")))
- columnsForm.append(HT.Input(type="hidden", name="species", value=self.species))
+ columnsForm.append(HT.Input(type="hidden", name="species", value=self.species))
if self.diffCol:
columnsForm.append(HT.Input(type="hidden", name="s1", value=self.diffCol[0]))
columnsForm.append(HT.Input(type="hidden", name="s2", value=self.diffCol[1]))
@@ -366,8 +366,8 @@ class IntervalAnalystPage(templatePage):
removeButton = HT.Input(type="button", name="remove", value="Remove", Class="button", onClick="removeFromList(this.form.columns.selectedIndex, this.form.columns)")
upButton = HT.Input(type="button", name="up", value="Up", Class="button", onClick="swapOptions(this.form.columns.selectedIndex, this.form.columns.selectedIndex-1, this.form.columns)")
downButton = HT.Input(type="button", name="down", value="Down", Class="button", onClick="swapOptions(this.form.columns.selectedIndex, this.form.columns.selectedIndex+1, this.form.columns)")
- clearButton = HT.Input(type="button", name="clear", value="Clear", Class="button", onClick="deleteAllElements(this.form.columns)")
- submitButton = HT.Input(type="submit", value="Refresh", Class="button", onClick="selectAllElements(this.form.columns)")
+ clearButton = HT.Input(type="button", name="clear", value="Clear", Class="button", onClick="deleteAllElements(this.form.columns)")
+ submitButton = HT.Input(type="submit", value="Refresh", Class="button", onClick="selectAllElements(this.form.columns)")
selectChrBox = HT.Select(name="chromosome")
self.cursor.execute("""
@@ -375,11 +375,11 @@ class IntervalAnalystPage(templatePage):
Chr_Length.Name, Length from Chr_Length, Species
where
Chr_Length.SpeciesId = Species.Id AND
- Species.Name = '%s'
+ Species.Name = '%s'
Order by
Chr_Length.OrderId
""" % self.species)
-
+
results = self.cursor.fetchall()
for chrInfo in results:
selectChrBox.append((chrInfo[0], chrInfo[0]))
@@ -401,5 +401,5 @@ class IntervalAnalystPage(templatePage):
#columnsForm.append(HT.Input(type="hidden", name="sort", value=diffCol),
# HT.Input(type="hidden", name="identification", value=identification),
# HT.Input(type="hidden", name="traitInfo", value=traitInfo))
-
+
return columnsForm, dispFields
diff --git a/wqflask/wqflask/marker_regression/MarkerRegressionPage.py b/wqflask/wqflask/marker_regression/MarkerRegressionPage.py
index d02d80b3..4c3391e5 100755
--- a/wqflask/wqflask/marker_regression/MarkerRegressionPage.py
+++ b/wqflask/wqflask/marker_regression/MarkerRegressionPage.py
@@ -72,7 +72,7 @@ class MarkerRegressionPage(templatePage):
#automatically generate pheno txt file for PLINK
self.genPhenoTxtFileForPlink(phenoFileName=plinkOutputFileName,RISetName=fd.RISet,probesetName=probesetName, valueDict=allTraitValueDict)
# os.system full path is required for input and output files; specify missing value is -9999
- plink_command = '%splink/plink --noweb --ped %splink/%s.ped --no-fid --no-parents --no-sex --no-pheno --map %splink/%s.map --pheno %s/%s.txt --pheno-name %s --missing-phenotype -9999 --out %s%s --assoc ' % (webqtlConfig.HTMLPATH, webqtlConfig.HTMLPATH, fd.RISet, webqtlConfig.HTMLPATH, fd.RISet, webqtlConfig.TMPDIR, plinkOutputFileName, probesetName, webqtlConfig.TMPDIR, plinkOutputFileName)
+ plink_command = '%splink/plink --noweb --ped %splink/%s.ped --no-fid --no-parents --no-sex --no-pheno --map %splink/%s.map --pheno %s/%s.txt --pheno-name %s --missing-phenotype -9999 --out %s%s --assoc ' % (webqtlConfig.GENODIR, webqtlConfig.GENODIR, fd.RISet, webqtlConfig.GENODIR, fd.RISet, webqtlConfig.TMPDIR, plinkOutputFileName, probesetName, webqtlConfig.TMPDIR, plinkOutputFileName)
os.system(plink_command)
@@ -140,7 +140,7 @@ class MarkerRegressionPage(templatePage):
intCanvas = pid.PILCanvas(size=(self.graphWidth,self.graphHeight))
gifmap = self.plotIntMappingForPLINK(fd, intCanvas, startMb = self.startMb, endMb = self.endMb, plinkResultDict=plinkResultDict)
- intCanvas.save(os.path.join(webqtlConfig.IMGDIR, filename), format='png')
+ intCanvas.save(os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, filename), format='png')
intImg=HT.Image('/image/'+filename+'.png', border=0, usemap='#WebQTLImageMap')
TD_LR = HT.TR(HT.TD(HT.Blockquote(gifmap,intImg, HT.P()), bgColor='#eeeeee', height = 200))
@@ -249,7 +249,7 @@ class MarkerRegressionPage(templatePage):
intCanvas = pid.PILCanvas(size=(self.graphWidth,self.graphHeight))
gifmap = self.plotIntMapping(fd, intCanvas, startMb = self.startMb, endMb = self.endMb, showLocusForm= "")
filename= webqtlUtil.genRandStr("Itvl_")
- intCanvas.save(os.path.join(webqtlConfig.IMGDIR, filename), format='png')
+ intCanvas.save(os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, filename), format='png')
intImg=HT.Image('/image/'+filename+'.png', border=0, usemap='#WebQTLImageMap')
################################################################
@@ -458,7 +458,7 @@ class MarkerRegressionPage(templatePage):
#plotBar(myCanvas,10,10,390,290,LRSArray,XLabel='LRS',YLabel='Frequency',title=' Histogram of Permutation Test',identification=fd.identification)
Plot.plotBar(myCanvas, LRSArray,XLabel='LRS',YLabel='Frequency',title=' Histogram of Permutation Test')
filename= webqtlUtil.genRandStr("Reg_")
- myCanvas.save(webqtlConfig.IMGDIR+filename, format='gif')
+ myCanvas.save(webqtlConfig.GENERATED_IMAGE_DIR+filename, format='gif')
img=HT.Image('/image/'+filename+'.gif',border=0,alt='Histogram of Permutation Test')
if fd.suggestive == None:
@@ -1597,7 +1597,7 @@ class MarkerRegressionPage(templatePage):
# get strain name from ped file in order
def getStrainNameFromPedFile(self, RISetName=''):
- pedFileopen= open("%splink/%s.ped"%(webqtlConfig.HTMLPATH, RISetName),"r")
+ pedFileopen= open("%splink/%s.ped"%(webqtlConfig.GENODIR, RISetName),"r")
line =pedFileopen.readline()
strainNameList=[]
diff --git a/wqflask/wqflask/marker_regression/gemma_mapping.py b/wqflask/wqflask/marker_regression/gemma_mapping.py
index 997b692d..caea5802 100644
--- a/wqflask/wqflask/marker_regression/gemma_mapping.py
+++ b/wqflask/wqflask/marker_regression/gemma_mapping.py
@@ -1,9 +1,7 @@
import os
from base import webqtlConfig
-from utility.tools import gemma_command
-
-GEMMA_PATH,GEMMA_COMMAND = gemma_command()
+from utility.tools import GEMMA_COMMAND
def run_gemma(this_dataset, samples, vals):
"""Generates p-values for each marker using GEMMA"""
@@ -12,8 +10,11 @@ def run_gemma(this_dataset, samples, vals):
gen_pheno_txt_file(this_dataset, samples, vals)
- os.chdir(GEMMA_PATH)
+ # Don't do this!
+ # os.chdir("{}gemma".format(webqtlConfig.GENODIR))
+ # use GEMMA_RUN in the next one, create a unique temp file
+
gemma_command = GEMMA_COMMAND + ' -bfile %s/%s -k %s/output/%s.cXX.txt -lmm 1 -o %s_output' % (GEMMA_PATH,
this_dataset.group.name,
GEMMA_PATH,
@@ -45,5 +46,5 @@ def parse_gemma_output(this_dataset):
included_markers.append(line.split("\t")[1])
p_values.append(float(line.split("\t")[10]))
- print("p_values: ", p_values)
- return included_markers, p_values \ No newline at end of file
+ #print("p_values: ", p_values)
+ return included_markers, p_values
diff --git a/wqflask/wqflask/marker_regression/marker_regression.py b/wqflask/wqflask/marker_regression/marker_regression.py
index 5377201b..26da95b9 100755..100644
--- a/wqflask/wqflask/marker_regression/marker_regression.py
+++ b/wqflask/wqflask/marker_regression/marker_regression.py
@@ -18,6 +18,7 @@ import numpy as np
from scipy import linalg
import cPickle as pickle
+import itertools
import simplejson as json
@@ -29,21 +30,16 @@ from flask import Flask, g
from base.trait import GeneralTrait
from base import data_set
from base import species
-from base import webqtlConfig
from utility import webqtlUtil
-#from wqflask.marker_regression import qtl_reaper_mapping
-#from wqflask.marker_regression import plink_mapping
-from wqflask.marker_regression import gemma_mapping
-#from wqflask.marker_regression import rqtl_mapping
from utility import helper_functions
from utility import Plot, Bunch
from utility import temp_data
from utility.benchmark import Bench
-from utility.tools import pylmm_command, plink_command, gemma_command
+from wqflask.marker_regression import gemma_mapping
-PYLMM_PATH,PYLMM_COMMAND = pylmm_command()
-PLINK_PATH,PLINK_COMMAND = plink_command()
-GEMMA_PATH,GEMMA_COMMAND = gemma_command()
+from utility.tools import locate, locate_ignore_error, PYLMM_COMMAND, GEMMA_COMMAND, PLINK_COMMAND, TEMPDIR
+from utility.external import shell
+from base.webqtlConfig import TMPDIR, GENERATED_TEXT_DIR
class MarkerRegression(object):
@@ -60,14 +56,24 @@ class MarkerRegression(object):
self.samples = [] # Want only ones with values
self.vals = []
-
+
+ #for sample in self.this_trait.data.keys():
for sample in self.dataset.group.samplelist:
- value = start_vars['value:' + sample]
- self.samples.append(str(sample))
- self.vals.append(value)
+ in_trait_data = False
+ for item in self.this_trait.data:
+ if self.this_trait.data[item].name2 == sample:
+ value = start_vars['value:' + self.this_trait.data[item].name]
+ self.samples.append(self.this_trait.data[item].name)
+ self.vals.append(value)
+ in_trait_data = True
+ break
+ if not in_trait_data:
+ value = start_vars['value:' + sample]
+ self.samples.append(sample)
+ self.vals.append(value)
self.mapping_method = start_vars['method']
- if start_vars['manhattan_plot'] == "true":
+ if start_vars['manhattan_plot'] == "True":
self.manhattan_plot = True
else:
self.manhattan_plot = False
@@ -79,54 +85,120 @@ class MarkerRegression(object):
self.score_type = "LRS" #ZS: LRS or LOD
self.mapping_scale = "physic"
self.num_perm = 0
-
+ self.perm_output = []
+ self.bootstrap_results = []
+
#ZS: This is passed to GN1 code for single chr mapping
- self.selected_chr = -1
+ self.selected_chr = -1
if "selected_chr" in start_vars:
- self.selected_chr = int(start_vars['selected_chr'])
+ if int(start_vars['selected_chr']) != -1: #ZS: Needs to be -1 if showing full map; there's probably a better way to fix this
+ self.selected_chr = int(start_vars['selected_chr']) + 1
+ else:
+ self.selected_chr = int(start_vars['selected_chr'])
+ if "startMb" in start_vars:
+ self.startMb = start_vars['startMb']
+ if "endMb" in start_vars:
+ self.endMb = start_vars['endMb']
+ if "graphWidth" in start_vars:
+ self.graphWidth = start_vars['graphWidth']
+ if "lrsMax" in start_vars:
+ self.lrsMax = start_vars['lrsMax']
+ if "haplotypeAnalystCheck" in start_vars:
+ self.haplotypeAnalystCheck = start_vars['haplotypeAnalystCheck']
+ if "startMb" in start_vars: #ZS: This is to ensure showGenes, Legend, etc are checked the first time you open the mapping page, since startMb will only not be set during the first load
+ if "permCheck" in start_vars:
+ self.permCheck = "ON"
+ else:
+ self.permCheck = False
+ self.num_perm = int(start_vars['num_perm'])
+
+ self.LRSCheck = start_vars['LRSCheck']
+
+ if "showSNP" in start_vars:
+ self.showSNP = start_vars['showSNP']
+ else:
+ self.showSNP = False
+
+ if "showGenes" in start_vars:
+ self.showGenes = start_vars['showGenes']
+ else:
+ self.showGenes = False
+
+ if "viewLegend" in start_vars:
+ self.viewLegend = start_vars['viewLegend']
+ else:
+ self.viewLegend = False
+ else:
+ try:
+ if int(start_vars['num_perm']) > 0:
+ self.num_perm = int(start_vars['num_perm'])
+ except:
+ self.num_perm = 0
+
+ self.LRSCheck = self.score_type
+ if self.num_perm > 0:
+ self.permCheck = "ON"
+ else:
+ self.permCheck = False
+ self.showSNP = "ON"
+ self.showGenes = "ON"
+ self.viewLegend = "ON"
self.dataset.group.get_markers()
if self.mapping_method == "gemma":
- self.score_type = "LRS"
- included_markers, p_values = gemma_mapping.run_gemma(self.dataset, self.samples, self.vals)
- self.dataset.group.get_specified_markers(markers = included_markers)
- self.dataset.group.markers.add_pvalues(p_values)
- results = self.dataset.group.markers.markers
+ self.score_type = "LOD"
+ self.manhattan_plot = True
+ with Bench("Running GEMMA"):
+ included_markers, p_values = gemma_mapping.run_gemma(self.dataset, self.samples, self.vals)
+ with Bench("Getting markers from csv"):
+ marker_obs = get_markers_from_csv(included_markers, p_values, self.dataset.group.name)
+ results = marker_obs
elif self.mapping_method == "rqtl_plink":
results = self.run_rqtl_plink()
elif self.mapping_method == "rqtl_geno":
self.score_type = "LOD"
self.mapping_scale = "morgan"
- if start_vars['num_perm'] == "":
- self.num_perm = 0
- else:
- self.num_perm = start_vars['num_perm']
- self.control = start_vars['control_marker']
+ self.control_marker = start_vars['control_marker']
self.do_control = start_vars['do_control']
self.method = start_vars['mapmethod_rqtl_geno']
self.model = start_vars['mapmodel_rqtl_geno']
-
if start_vars['pair_scan'] == "true":
self.pair_scan = True
-
results = self.run_rqtl_geno()
- elif self.mapping_method == "reaper":
- if start_vars['num_perm'] == "":
- self.num_perm = 0
+ elif self.mapping_method == "reaper":
+ if "startMb" in start_vars: #ZS: Check if first time page loaded, so it can default to ON
+ if "additiveCheck" in start_vars:
+ self.additiveCheck = start_vars['additiveCheck']
+ else:
+ self.additiveCheck = False
+
+ if "bootCheck" in start_vars:
+ self.bootCheck = "ON"
+ else:
+ self.bootCheck = False
+ self.num_bootstrap = int(start_vars['num_bootstrap'])
else:
- self.num_perm = int(start_vars['num_perm'])
- self.additive = False
- self.control = start_vars['control_marker']
+ self.additiveCheck = "ON"
+ try:
+ if int(start_vars['num_bootstrap']) > 0:
+ self.bootCheck = "ON"
+ self.num_bootstrap = int(start_vars['num_bootstrap'])
+ else:
+ self.bootCheck = False
+ self.num_bootstrap = 0
+ except:
+ self.bootCheck = False
+ self.num_bootstrap = 0
+
+ self.control_marker = start_vars['control_marker']
self.do_control = start_vars['do_control']
results = self.gen_reaper_results()
elif self.mapping_method == "plink":
results = self.run_plink()
elif self.mapping_method == "pylmm":
print("RUNNING PYLMM")
- self.num_perm = start_vars['num_perm']
- if self.num_perm != "":
- if int(self.num_perm) > 0:
- self.run_permutations(str(temp_uuid))
+ if self.num_perm > 0:
+ self.run_permutations(str(temp_uuid))
results = self.gen_data(str(temp_uuid))
else:
print("RUNNING NOTHING")
@@ -141,6 +213,9 @@ class MarkerRegression(object):
if 'lod_score' in marker.keys():
self.qtl_results.append(marker)
+
+ self.trimmed_markers = results
+
for qtl in enumerate(self.qtl_results):
self.json_data['chr1'].append(str(qtl['chr1']))
self.json_data['chr2'].append(str(qtl['chr2']))
@@ -154,7 +229,7 @@ class MarkerRegression(object):
maf = self.maf,
manhattan_plot = self.manhattan_plot,
mapping_scale = self.mapping_scale,
- qtl_results = self.qtl_results,
+ qtl_results = self.qtl_results
)
else:
@@ -168,6 +243,8 @@ class MarkerRegression(object):
if ('lod_score' in marker.keys()) or ('lrs_value' in marker.keys()):
self.qtl_results.append(marker)
+ self.trimmed_markers = trim_markers_for_table(results)
+
self.json_data['chr'] = []
self.json_data['pos'] = []
self.json_data['lod.hk'] = []
@@ -181,7 +258,7 @@ class MarkerRegression(object):
#if index<40:
# print("lod score is:", qtl['lod_score'])
if qtl['chr'] == highest_chr and highest_chr != "X" and highest_chr != "X/Y":
- print("changing to X")
+ #print("changing to X")
self.json_data['chr'].append("X")
else:
self.json_data['chr'].append(str(qtl['chr']))
@@ -212,6 +289,8 @@ class MarkerRegression(object):
mapping_scale = self.mapping_scale,
chromosomes = chromosome_mb_lengths,
qtl_results = self.qtl_results,
+ num_perm = self.num_perm,
+ perm_results = self.perm_output,
)
@@ -226,29 +305,21 @@ class MarkerRegression(object):
self.dataset.group.name,
self.dataset.group.name,
self.dataset.group.name)
- print("gemma_command:" + gemma_command)
+ #print("gemma_command:" + gemma_command)
os.system(gemma_command)
included_markers, p_values = self.parse_gemma_output()
self.dataset.group.get_specified_markers(markers = included_markers)
-
- #for marker in self.dataset.group.markers.markers:
- # if marker['name'] not in included_markers:
- # print("marker:", marker)
- # self.dataset.group.markers.markers.remove(marker)
- # #del self.dataset.group.markers.markers[marker]
-
self.dataset.group.markers.add_pvalues(p_values)
-
return self.dataset.group.markers.markers
-
def parse_gemma_output(self):
included_markers = []
p_values = []
- with open("/home/zas1024/gene/web/gemma/output/{}_output.assoc.txt".format(self.dataset.group.name)) as output_file:
+ # Use a temporary file name here!
+ with open(webqtlConfig.GENERATED_TEXT_DIR+"/{}_output.assoc.txt".format(self.dataset.group.name)) as output_file:
for line in output_file:
if line.startswith("chr"):
continue
@@ -261,46 +332,24 @@ class MarkerRegression(object):
def gen_pheno_txt_file(self):
"""Generates phenotype file for GEMMA"""
-
- #with open("/home/zas1024/gene/web/gemma/tmp_pheno/{}.txt".format(filename), "w") as outfile:
- # for sample, i in enumerate(self.samples):
- # print("sample:" + str(i))
- # print("self.vals[i]:" + str(self.vals[sample]))
- # outfile.write(str(i) + "\t" + str(self.vals[sample]) + "\n")
-
- with open("/home/zas1024/gene/web/gemma/{}.fam".format(self.dataset.group.name), "w") as outfile:
+ with open(webqtlConfig.GENERATED_TEXT_DIR+"{}.fam".format(self.dataset.group.name), "w") as outfile:
for i, sample in enumerate(self.samples):
outfile.write(str(sample) + " " + str(sample) + " 0 0 0 " + str(self.vals[i]) + "\n")
-
- #def gen_plink_for_gemma(self, filename):
- #
- # make_bed = "/home/zas1024/plink/plink --file /home/zas1024/plink/%s --noweb --no-fid --no-parents --no-sex --no-pheno --pheno %s%s.txt --out %s%s --make-bed" % (webqtlConfig.HTMLPATH,
- # webqtlConfig.HTMLPATH,
- # self.dataset.group.name,
- # webqtlConfig.TMPDIR,
- # filename,
- # webqtlConfig.TMPDIR,
- # filename)
- #
- #
def run_rqtl_plink(self):
- os.chdir("/home/zas1024/plink")
+ # os.chdir("") never do this inside a webserver!!
output_filename = webqtlUtil.genRandStr("%s_%s_"%(self.dataset.group.name, self.this_trait.name))
self.gen_pheno_txt_file_plink(pheno_filename = output_filename)
- rqtl_command = './plink --noweb --ped %s.ped --no-fid --no-parents --no-sex --no-pheno --map %s.map --pheno %s/%s.txt --pheno-name %s --maf %s --missing-phenotype -9999 --out %s%s --assoc ' % (self.dataset.group.name, self.dataset.group.name, webqtlConfig.TMPDIR, plink_output_filename, self.this_trait.name, self.maf, webqtlConfig.TMPDIR, plink_output_filename)
+ rqtl_command = './plink --noweb --ped %s.ped --no-fid --no-parents --no-sex --no-pheno --map %s.map --pheno %s/%s.txt --pheno-name %s --maf %s --missing-phenotype -9999 --out %s%s --assoc ' % (self.dataset.group.name, self.dataset.group.name, TMPDIR, plink_output_filename, self.this_trait.name, self.maf, TMPDIR, plink_output_filename)
os.system(rqtl_command)
count, p_values = self.parse_rqtl_output(plink_output_filename)
def geno_to_rqtl_function(self): # TODO: Need to figure out why some genofiles have the wrong format and don't convert properly
- print("Adding some custom helper functions to the R environment")
-
-
ro.r("""
trim <- function( x ) { gsub("(^[[:space:]]+|[[:space:]]+$)", "", x) }
@@ -332,8 +381,6 @@ class MarkerRegression(object):
""" % (self.dataset.group.name + ".geno"))
def run_rqtl_geno(self):
- print("Calling R/qtl")
-
self.geno_to_rqtl_function()
## Get pointers to some common R functions
@@ -342,7 +389,7 @@ class MarkerRegression(object):
r_sum = ro.r["sum"] # Map the sum function
plot = ro.r["plot"] # Map the plot function
postscript = ro.r["postscript"] # Map the postscript function
- png = ro.r["png"] # Map the png function
+ png = ro.r["png"] # Map the png function
dev_off = ro.r["dev.off"] # Map the device off function
print(r_library("qtl")) # Load R/qtl
@@ -353,12 +400,13 @@ class MarkerRegression(object):
calc_genoprob = ro.r["calc.genoprob"] # Map the calc.genoprob function
read_cross = ro.r["read.cross"] # Map the read.cross function
write_cross = ro.r["write.cross"] # Map the write.cross function
- GENOtoCSVR = ro.r["GENOtoCSVR"] # Map the GENOtoCSVR function
+ GENOtoCSVR = ro.r["GENOtoCSVR"] # Map the local GENOtoCSVR function
- genofilelocation = webqtlConfig.HTMLPATH + "genotypes/" + self.dataset.group.name + ".geno"
- crossfilelocation = webqtlConfig.HTMLPATH + "genotypes/" + self.dataset.group.name + ".cross"
+ crossname = self.dataset.group.name
+ genofilelocation = locate(crossname + ".geno", "genotype")
+ crossfilelocation = TMPDIR + crossname + ".cross"
- print("Conversion of geno to cross at location:", genofilelocation, " to ", crossfilelocation)
+ #print("Conversion of geno to cross at location:", genofilelocation, " to ", crossfilelocation)
cross_object = GENOtoCSVR(genofilelocation, crossfilelocation) # TODO: Add the SEX if that is available
@@ -380,10 +428,10 @@ class MarkerRegression(object):
else:
print("No covariates"); result_data_frame = scantwo(cross_object, pheno = "the_pheno", model=self.model, method=self.method, n_cluster = 16)
- print("Pair scan results:", result_data_frame)
+ #print("Pair scan results:", result_data_frame)
self.pair_scan_filename = webqtlUtil.genRandStr("scantwo_") + ".png"
- png(file=webqtlConfig.TMPDIR+self.pair_scan_filename)
+ png(file=TEMPDIR+self.pair_scan_filename)
plot(result_data_frame)
dev_off()
@@ -395,11 +443,11 @@ class MarkerRegression(object):
else:
print("No covariates"); result_data_frame = scanone(cross_object, pheno = "the_pheno", model=self.model, method=self.method)
- if int(self.num_perm) > 0: # Do permutation (if requested by user)
+ if self.num_perm > 0 and self.permCheck == "ON": # Do permutation (if requested by user)
if self.do_control == "true":
- perm_data_frame = scanone(cross_object, pheno_col = "the_pheno", addcovar = covar, n_perm = int(self.num_perm), model=self.model, method=self.method)
+ perm_data_frame = scanone(cross_object, pheno_col = "the_pheno", addcovar = covar, n_perm = self.num_perm, model=self.model, method=self.method)
else:
- perm_data_frame = scanone(cross_object, pheno_col = "the_pheno", n_perm = int(self.num_perm), model=self.model, method=self.method)
+ perm_data_frame = scanone(cross_object, pheno_col = "the_pheno", n_perm = self.num_perm, model=self.model, method=self.method)
self.process_rqtl_perm_results(perm_data_frame) # Functions that sets the thresholds for the webinterface
@@ -413,15 +461,15 @@ class MarkerRegression(object):
def create_covariates(self, cross):
ro.globalenv["the_cross"] = cross
ro.r('genotypes <- pull.geno(the_cross)') # Get the genotype matrix
- userinputS = self.control.replace(" ", "").split(",") # TODO: sanitize user input, Never Ever trust a user
+ userinputS = self.control_marker.replace(" ", "").split(",") # TODO: sanitize user input, Never Ever trust a user
covariate_names = ', '.join('"{0}"'.format(w) for w in userinputS)
- print("Marker names of selected covariates:", covariate_names)
+ #print("Marker names of selected covariates:", covariate_names)
ro.r('covnames <- c(' + covariate_names + ')')
ro.r('covInGeno <- which(covnames %in% colnames(genotypes))')
ro.r('covnames <- covnames[covInGeno]')
ro.r("cat('covnames (purged): ', covnames,'\n')")
ro.r('covariates <- genotypes[,covnames]') # Get the covariate matrix by using the marker name as index to the genotype file
- print("R/qtl matrix of covariates:", ro.r["covariates"])
+ #print("R/qtl matrix of covariates:", ro.r["covariates"])
return ro.r["covariates"]
def sanitize_rqtl_phenotype(self):
@@ -445,7 +493,7 @@ class MarkerRegression(object):
result = result[1]
output = [tuple([result[j][i] for j in range(result.ncol)]) for i in range(result.nrow)]
- print("R/qtl scantwo output:", output)
+ #print("R/qtl scantwo output:", output)
for i, line in enumerate(result.iter_row()):
marker = {}
@@ -455,7 +503,7 @@ class MarkerRegression(object):
marker['chr2'] = int(output[i][2])
pair_scan_results.append(marker)
- print("pair_scan_results:", pair_scan_results)
+ #print("pair_scan_results:", pair_scan_results)
return pair_scan_results
@@ -463,7 +511,7 @@ class MarkerRegression(object):
qtl_results = []
output = [tuple([result[j][i] for j in range(result.ncol)]) for i in range(result.nrow)]
- print("R/qtl scanone output:", output)
+ #print("R/qtl scanone output:", output)
for i, line in enumerate(result.iter_row()):
marker = {}
@@ -477,10 +525,11 @@ class MarkerRegression(object):
def process_rqtl_perm_results(self, results):
perm_vals = []
- for line in str(results).split("\n")[1:(int(self.num_perm)+1)]:
- print("R/qtl permutation line:", line.split())
+ for line in str(results).split("\n")[1:(self.num_perm+1)]:
+ #print("R/qtl permutation line:", line.split())
perm_vals.append(float(line.split()[1]))
+ self.perm_output = perm_vals
self.suggestive = np.percentile(np.array(perm_vals), 67)
self.significant = np.percentile(np.array(perm_vals), 95)
@@ -492,7 +541,7 @@ class MarkerRegression(object):
self.gen_pheno_txt_file_plink(pheno_filename = plink_output_filename)
- plink_command = PLINK_COMMAND + ' --noweb --ped %s/%s.ped --no-fid --no-parents --no-sex --no-pheno --map %s/%s.map --pheno %s%s.txt --pheno-name %s --maf %s --missing-phenotype -9999 --out %s%s --assoc ' % (PLINK_PATH, self.dataset.group.name, PLINK_PATH, self.dataset.group.name, webqtlConfig.TMPDIR, plink_output_filename, self.this_trait.name, self.maf, webqtlConfig.TMPDIR, plink_output_filename)
+ plink_command = PLINK_COMMAND + ' --noweb --ped %s/%s.ped --no-fid --no-parents --no-sex --no-pheno --map %s/%s.map --pheno %s%s.txt --pheno-name %s --maf %s --missing-phenotype -9999 --out %s%s --assoc ' % (PLINK_PATH, self.dataset.group.name, PLINK_PATH, self.dataset.group.name, TMPDIR, plink_output_filename, self.this_trait.name, self.maf, TMPDIR, plink_output_filename)
print("plink_command:", plink_command)
os.system(plink_command)
@@ -514,7 +563,7 @@ class MarkerRegression(object):
def gen_pheno_txt_file_plink(self, pheno_filename = ''):
ped_sample_list = self.get_samples_from_ped_file()
- output_file = open("%s%s.txt" % (webqtlConfig.TMPDIR, pheno_filename), "wb")
+ output_file = open("%s%s.txt" % (TMPDIR, pheno_filename), "wb")
header = 'FID\tIID\t%s\n' % self.this_trait.name
output_file.write(header)
@@ -549,7 +598,7 @@ class MarkerRegression(object):
def gen_pheno_txt_file_rqtl(self, pheno_filename = ''):
ped_sample_list = self.get_samples_from_ped_file()
- output_file = open("%s%s.txt" % (webqtlConfig.TMPDIR, pheno_filename), "wb")
+ output_file = open("%s%s.txt" % (TMPDIR, pheno_filename), "wb")
header = 'FID\tIID\t%s\n' % self.this_trait.name
output_file.write(header)
@@ -602,41 +651,73 @@ class MarkerRegression(object):
def gen_reaper_results(self):
genotype = self.dataset.group.read_genotype_file()
- samples, values, variances = self.this_trait.export_informative()
-
+ if self.manhattan_plot != True:
+ genotype = genotype.addinterval()
+
+ samples, values, variances, sample_aliases = self.this_trait.export_informative()
+
trimmed_samples = []
trimmed_values = []
for i in range(0, len(samples)):
- if samples[i] in self.dataset.group.samplelist:
- trimmed_samples.append(samples[i])
+ if self.this_trait.data[samples[i]].name2 in self.dataset.group.samplelist:
+ trimmed_samples.append(sample_aliases[i])
trimmed_values.append(values[i])
+
+ #print("THE SAMPLES:", trimmed_samples)
- self.lrs_array = genotype.permutation(strains = trimmed_samples,
- trait = trimmed_values,
- nperm= self.num_perm)
-
- self.suggestive = self.lrs_array[int(self.num_perm*0.37-1)]
- self.significant = self.lrs_array[int(self.num_perm*0.95-1)]
+ if self.num_perm < 100:
+ self.suggestive = 0
+ self.significant = 0
+ else:
+ self.perm_output = genotype.permutation(strains = trimmed_samples, trait = trimmed_values, nperm=self.num_perm)
+ self.suggestive = self.perm_output[int(self.num_perm*0.37-1)]
+ self.significant = self.perm_output[int(self.num_perm*0.95-1)]
+ self.highly_significant = self.perm_output[int(self.num_perm*0.99-1)]
+
self.json_data['suggestive'] = self.suggestive
self.json_data['significant'] = self.significant
- print("samples:", trimmed_samples)
-
- if self.control != "" and self.do_control == "true":
- print("CONTROL IS:", self.control)
+ if self.control_marker != "" and self.do_control == "true":
reaper_results = genotype.regression(strains = trimmed_samples,
- trait = trimmed_values,
- control = str(self.control))
+ trait = trimmed_values,
+ control = str(self.control_marker))
+ if self.bootCheck:
+ control_geno = []
+ control_geno2 = []
+ _FIND = 0
+ for _chr in genotype:
+ for _locus in _chr:
+ if _locus.name == self.control_marker:
+ control_geno2 = _locus.genotype
+ _FIND = 1
+ break
+ if _FIND:
+ break
+ if control_geno2:
+ _prgy = list(genotype.prgy)
+ for _strain in trimmed_samples:
+ _idx = _prgy.index(_strain)
+ control_geno.append(control_geno2[_idx])
+
+ self.bootstrap_results = genotype.bootstrap(strains = trimmed_samples,
+ trait = trimmed_values,
+ control = control_geno,
+ nboot = self.num_bootstrap)
else:
reaper_results = genotype.regression(strains = trimmed_samples,
- trait = trimmed_values)
+ trait = trimmed_values)
+
+ if self.bootCheck:
+ self.bootstrap_results = genotype.bootstrap(strains = trimmed_samples,
+ trait = trimmed_values,
+ nboot = self.num_bootstrap)
self.json_data['chr'] = []
self.json_data['pos'] = []
self.json_data['lod.hk'] = []
self.json_data['markernames'] = []
- if self.additive:
- self.json_data['additive'] = []
+ #if self.additive:
+ # self.json_data['additive'] = []
#Need to convert the QTL objects that qtl reaper returns into a json serializable dictionary
qtl_results = []
@@ -650,8 +731,8 @@ class MarkerRegression(object):
self.json_data['pos'].append(reaper_locus.Mb)
self.json_data['lod.hk'].append(qtl.lrs)
self.json_data['markernames'].append(reaper_locus.name)
- if self.additive:
- self.json_data['additive'].append(qtl.additive)
+ #if self.additive:
+ # self.json_data['additive'].append(qtl.additive)
locus = {"name":reaper_locus.name, "chr":reaper_locus.chr, "cM":reaper_locus.cM, "Mb":reaper_locus.Mb}
qtl = {"lrs_value": qtl.lrs, "chr":converted_chr, "Mb":reaper_locus.Mb,
"cM":reaper_locus.cM, "name":reaper_locus.name, "additive":qtl.additive, "dominance":qtl.dominance}
@@ -665,7 +746,7 @@ class MarkerRegression(object):
threshold_p_value = 0.01
- result_fp = open("%s%s.qassoc"% (webqtlConfig.TMPDIR, output_filename), "rb")
+ result_fp = open("%s%s.qassoc"% (TMPDIR, output_filename), "rb")
header_line = result_fp.readline()# read header line
line = result_fp.readline()
@@ -741,9 +822,9 @@ class MarkerRegression(object):
top_lod_scores = []
- print("self.num_perm:", self.num_perm)
+ #print("self.num_perm:", self.num_perm)
- for permutation in range(int(self.num_perm)):
+ for permutation in range(self.num_perm):
pheno_vector = np.array([val == "x" and np.nan or float(val) for val in self.vals])
np.random.shuffle(pheno_vector)
@@ -775,9 +856,7 @@ class MarkerRegression(object):
Redis.expire(key, 60*60)
command = PYLMM_COMMAND+' --key {} --species {}'.format(key,"other")
-
- os.system(command)
-
+ shell(command)
json_results = Redis.blpop("pylmm:results:" + temp_uuid, 45*60)
results = json.loads(json_results[1])
@@ -788,10 +867,10 @@ class MarkerRegression(object):
if p_value < lowest_p_value:
lowest_p_value = p_value
- print("lowest_p_value:", lowest_p_value)
+ #print("lowest_p_value:", lowest_p_value)
top_lod_scores.append(-math.log10(lowest_p_value))
- print("top_lod_scores:", top_lod_scores)
+ #print("top_lod_scores:", top_lod_scores)
self.suggestive = np.percentile(top_lod_scores, 67)
self.significant = np.percentile(top_lod_scores, 95)
@@ -852,12 +931,11 @@ class MarkerRegression(object):
Redis.expire(key, 60*60)
print("before printing command")
- command = PYLMM_COMMAND + ' --key {} --species {}'.format(key,
- "other")
+ command = PYLMM_COMMAND + ' --key {} --species {}'.format(key, "other")
print("command is:", command)
print("after printing command")
- os.system(command)
+ shell(command)
#t_stats, p_values = lmm.run(key)
#lmm.run(key)
@@ -894,8 +972,7 @@ class MarkerRegression(object):
#def gen_human_results(self, pheno_vector, tempdata):
def gen_human_results(self, pheno_vector, key, temp_uuid):
- file_base = os.path.join(webqtlConfig.PYLMM_PATH, self.dataset.group.name)
- print("file_base:", file_base)
+ file_base = locate(self.dataset.group.name,"mapping")
plink_input = input.plink(file_base, type='b')
input_file_name = os.path.join(webqtlConfig.SNP_PATH, self.dataset.group.name + ".snps.gz")
@@ -987,7 +1064,11 @@ class MarkerRegression(object):
return trimmed_genotype_data
def create_snp_iterator_file(group):
- plink_file_base = os.path.join(webqtlConfig.PYLMM_PATH, group)
+ """
+ This function is only called by main below
+ """
+ raise Exception("Paths are undefined here")
+ plink_file_base = os.path.join(TMPDIR, group)
plink_input = input.plink(plink_file_base, type='b')
data = dict(plink_input = list(plink_input),
@@ -1004,12 +1085,47 @@ def create_snp_iterator_file(group):
with gzip.open(snp_file_base, "wb") as fh:
pickle.dump(data, fh, pickle.HIGHEST_PROTOCOL)
-#if __name__ == '__main__':
-# import cPickle as pickle
-# import gzip
-# create_snp_iterator_file("HLC")
+def trim_markers_for_table(markers):
+ num_markers = len(markers)
+
+ if 'lod_score' in markers[0].keys():
+ sorted_markers = sorted(markers, key=lambda k: k['lod_score'], reverse=True)
+ else:
+ sorted_markers = sorted(markers, key=lambda k: k['lrs_value'], reverse=True)
+
+ #ZS: So we end up with a list of just 200 markers
+ if len(sorted_markers) >= 200:
+ trimming_factor = 200 / len(sorted_markers)
+ trimmed_sorted_markers = sorted_markers[:int(len(sorted_markers) * trimming_factor)]
+ return trimmed_sorted_markers
+ else:
+ return sorted_markers
+
+
+def get_markers_from_csv(included_markers, p_values, group_name):
+ marker_data_fh = open(os.path.join(webqtlConfig.PYLMM_PATH + group_name + '_markers.csv'))
+ markers = []
+ for marker_name, p_value in itertools.izip(included_markers, p_values):
+ if not p_value or len(included_markers) < 1:
+ continue
+ for line in marker_data_fh:
+ splat = line.strip().split()
+ if splat[0] == marker_name:
+ marker = {}
+ marker['name'] = splat[0]
+ marker['chr'] = int(splat[1])
+ marker['Mb'] = float(splat[2])
+ marker['p_value'] = p_value
+ if math.isnan(marker['p_value']) or (marker['p_value'] <= 0):
+ marker['lod_score'] = 0
+ marker['lrs_value'] = 0
+ else:
+ marker['lod_score'] = -math.log10(marker['p_value'])
+ marker['lrs_value'] = -math.log10(marker['p_value']) * 4.61
+ markers.append(marker)
+ break
+
+ return markers
if __name__ == '__main__':
import cPickle as pickle
- import gzip
- create_snp_iterator_file("HLC")
diff --git a/wqflask/wqflask/marker_regression/marker_regression_gn1.py b/wqflask/wqflask/marker_regression/marker_regression_gn1.py
index a7b5fad3..4460c06d 100644
--- a/wqflask/wqflask/marker_regression/marker_regression_gn1.py
+++ b/wqflask/wqflask/marker_regression/marker_regression_gn1.py
@@ -24,7 +24,6 @@
#
# Last updated by Zach 12/14/2010
-
import time
import string
from math import *
@@ -37,22 +36,13 @@ from flask import Flask, g
from htmlgen import HTMLgen2 as HT
-
-from utility import helper_functions
-from utility import Plot
from base import webqtlConfig
-#from intervalAnalyst import GeneUtil
-#from base.webqtlTrait import webqtlTrait
-#from base.templatePage import templatePage
+from base.GeneralObject import GeneralObject
from utility import webqtlUtil
-#from utility.THCell import THCell
-#from utility.TDCell import TDCell
-#from dbFunction import webqtlDatabaseFunction
-#from base.GeneralObject import GeneralObject
-
-#import logging
-#logging.basicConfig(filename="/tmp/gn_leiyan.log", level=logging.INFO)
-#_log = logging.getLogger("gn\web\webqtl\intervalMapping\IntervalMappingPage.py")
+from utility import helper_functions
+from utility import Plot
+from wqflask.interval_analyst import GeneUtil
+from base.webqtlConfig import TMPDIR, GENERATED_TEXT_DIR, GENERATED_IMAGE_DIR
#########################################
# Inteval Mapping Plot Page
@@ -122,10 +112,10 @@ class MarkerRegression(object):
SIGNIFICANT_WIDTH = 5
SUGGESTIVE_WIDTH = 5
ADDITIVE_COLOR_POSITIVE = pid.green
- ADDITIVE_COLOR_NEGATIVE = pid.red
+ ADDITIVE_COLOR_NEGATIVE = pid.orange
ADDITIVE_COLOR = ADDITIVE_COLOR_POSITIVE
DOMINANCE_COLOR_POSITIVE = pid.darkviolet
- DOMINANCE_COLOR_NEGATIVE = pid.orange
+ DOMINANCE_COLOR_NEGATIVE = pid.red
## BEGIN HaplotypeAnalyst
HAPLOTYPE_POSITIVE = pid.green
@@ -179,14 +169,15 @@ class MarkerRegression(object):
self.species = start_vars['species']
#Needing for form submission when doing single chr mapping or remapping after changing options
- self.vals = start_vars['vals']
- self.mapping_method = start_vars['mapping_method']
+ self.vals = start_vars['vals']
+ self.mapping_method = start_vars['mapping_method']
if self.mapping_method == "rqtl_geno":
self.mapmethod_rqtl_geno = start_vars['method']
self.mapmodel_rqtl_geno = start_vars['model']
self.pair_scan = start_vars['pair_scan']
self.js_data = start_vars['js_data']
+ self.trimmed_markers = start_vars['trimmed_markers'] #Top markers to display in table
#ZS: Think I can just get all this from dataset object now
#RISet and Species
@@ -203,42 +194,57 @@ class MarkerRegression(object):
#
#self.species = webqtlDatabaseFunction.retrieveSpecies(cursor=self.cursor, RISet=fd.RISet)
- if self.dataset.species == "rat":
+ if self.dataset.group.species == "rat":
self._ucscDb = "rn3"
- elif self.dataset.species == "mouse":
+ elif self.dataset.group.species == "mouse":
self._ucscDb = "mm9"
else:
self._ucscDb = ""
+
#####################################
# Options
#####################################
#Mapping options
- self.plotScale = start_vars['mapping_scale']
- #self.plotScale = fd.formdata.getvalue('scale', 'physic')
- #if self.plotScale == 'physic' and not fd.genotype.Mbmap: #ZS: Not sure where "Mbmap" is stored, if at all; should be fine without this though
- # self.plotScale = 'morgan'
- if start_vars['num_perm'] != "":
+ if start_vars['mapping_scale'] != "":
+ self.plotScale = start_vars['mapping_scale']
+ else:
+ self.plotScale = "physic"
+
+ if 'permCheck' in start_vars.keys():
+ self.permChecked = start_vars['permCheck']
+ else:
+ self.permChecked = False
+ if start_vars['num_perm'] > 0:
self.nperm = int(start_vars['num_perm'])
+ if self.permChecked:
+ self.perm_output = start_vars['perm_output']
+ self.suggestive = start_vars['suggestive']
+ self.significant = start_vars['significant']
else:
self.nperm = 0
- if (start_vars['num_perm'] == "") or (start_vars['num_perm'] < 1):
- self.permChecked = False
+
+ if 'bootCheck' in start_vars.keys():
+ self.bootChecked = start_vars['bootCheck']
+ else:
+ self.bootChecked = False
+ if 'num_bootstrap' in start_vars.keys():
+ self.nboot = int(start_vars['num_bootstrap'])
else:
- self.permChecked = True
- #self.permChecked = fd.formdata.getvalue('permCheck', True)
- self.bootChecked = False #ZS: For now setting to False, I'll add this option later once rest of figure works
- #self.bootChecked = fd.formdata.getvalue('bootCheck', '')
+ self.nboot = 0
+ if 'bootstrap_results' in start_vars.keys():
+ self.bootResult = start_vars['bootstrap_results']
+ else:
+ self.bootResult = []
+
if 'do_control' in start_vars.keys():
self.doControl = start_vars['do_control']
else:
self.doControl = "false"
- if 'control' in start_vars.keys():
- self.controlLocus = start_vars['control']
+ if 'control_marker' in start_vars.keys():
+ self.controlLocus = start_vars['control_marker']
else:
self.controlLocus = ""
-
- #self.controlLocus = fd.formdata.getvalue('controlLocus', '')
#try:
self.selectedChr = int(start_vars['selected_chr'])
@@ -257,46 +263,59 @@ class MarkerRegression(object):
#Darwing Options
try:
- if self.selectedChr > -1:
- self.graphWidth = min(self.GRAPH_MAX_WIDTH, self.GRAPH_MIN_WIDTH)
- else:
- self.graphWidth = min(self.GRAPH_MAX_WIDTH, self.MULT_GRAPH_MIN_WIDTH)
+ if self.selectedChr > -1:
+ self.graphWidth = min(self.GRAPH_MAX_WIDTH, max(self.GRAPH_MIN_WIDTH, int(start_vars['graphWidth'])))
+ else:
+ self.graphWidth = min(self.GRAPH_MAX_WIDTH, max(self.MULT_GRAPH_MIN_WIDTH, int(start_vars['graphWidth'])))
except:
- if self.selectedChr > -1:
- self.graphWidth = self.GRAPH_DEFAULT_WIDTH
- else:
- self.graphWidth = self.MULT_GRAPH_DEFAULT_WIDTH
-
- #try:
- # if self.selectedChr > -1:
- # self.graphWidth = min(self.GRAPH_MAX_WIDTH, max(self.GRAPH_MIN_WIDTH, int(fd.formdata.getvalue('graphWidth'))))
- # else:
- # self.graphWidth = min(self.GRAPH_MAX_WIDTH, max(self.MULT_GRAPH_MIN_WIDTH, int(fd.formdata.getvalue('graphWidth'))))
- #except:
- # if self.selectedChr > -1:
- # self.graphWidth = self.GRAPH_DEFAULT_WIDTH
- # else:
- # self.graphWidth = self.MULT_GRAPH_DEFAULT_WIDTH
+ if self.selectedChr > -1:
+ self.graphWidth = self.GRAPH_DEFAULT_WIDTH
+ else:
+ self.graphWidth = self.MULT_GRAPH_DEFAULT_WIDTH
## BEGIN HaplotypeAnalyst
#self.haplotypeAnalystChecked = fd.formdata.getvalue('haplotypeAnalystCheck')
- self.haplotypeAnalystChecked = False
+ if 'haplotypeAnalystCheck' in start_vars.keys():
+ self.haplotypeAnalystChecked = start_vars['haplotypeAnalystCheck']
+ else:
+ self.haplotypeAnalystChecked = False
## END HaplotypeAnalyst
-
self.graphHeight = self.GRAPH_DEFAULT_HEIGHT
- self.additiveChecked = False
+ self.manhattan_plot = start_vars['manhattan_plot']
self.dominanceChecked = False
- self.LRS_LOD = start_vars['score_type']
+ self.LRS_LOD = start_vars['LRSCheck']
self.cutoff = start_vars['cutoff']
- self.intervalAnalystChecked = False
- self.legendChecked = False
- self.geneChecked = False
- self.SNPChecked = False
+ self.intervalAnalystChecked = True
self.draw2X = False
- self.lrsMax = 0
- self.startMb = -1
- self.endMb = -1
+ if 'additiveCheck' in start_vars.keys():
+ self.additiveChecked = start_vars['additiveCheck']
+ else:
+ self.additiveChecked = False
+ if 'viewLegend' in start_vars.keys():
+ self.legendChecked = start_vars['viewLegend']
+ else:
+ self.legendChecked = False
+ if 'showSNP' in start_vars.keys():
+ self.SNPChecked = start_vars['showSNP']
+ else:
+ self.SNPChecked = False
+ if 'showGenes' in start_vars.keys():
+ self.geneChecked = start_vars['showGenes']
+ else:
+ self.geneChecked = False
+ try:
+ self.startMb = float(start_vars['startMb'])
+ except:
+ self.startMb = -1
+ try:
+ self.endMb = float(start_vars['endMb'])
+ except:
+ self.endMb = -1
+ try:
+ self.lrsMax = float(start_vars['lrsMax'])
+ except:
+ self.lrsMax = 0
#self.additiveChecked = fd.formdata.getvalue('additiveCheck')
#self.dominanceChecked = fd.formdata.getvalue('dominanceCheck')
@@ -335,7 +354,7 @@ class MarkerRegression(object):
self.ChrList.append((indChr.name, i))
-
+
self.ChrLengthMbList = g.db.execute("""
Select
Length from Chr_Length, InbredSet
@@ -411,20 +430,21 @@ class MarkerRegression(object):
## BEGIN HaplotypeAnalyst
## count the amount of individuals to be plotted, and increase self.graphHeight
- #if self.haplotypeAnalystChecked and self.selectedChr > -1:
- # thisTrait = self.traitList[0]
- # _strains, _vals, _vars = thisTrait.exportInformative()
- # smd=[]
- # for ii, _val in enumerate(_vals):
- # temp = GeneralObject(name=_strains[ii], value=_val)
- # smd.append(temp)
- # bxdlist=list(self.genotype.prgy)
- # for j,_geno in enumerate (self.genotype[0][1].genotype):
- # for item in smd:
- # if item.name == bxdlist[j]:
- # self.NR_INDIVIDUALS = self.NR_INDIVIDUALS + 1
-## default:
- # self.graphHeight = self.graphHeight + 2 * (self.NR_INDIVIDUALS+10) * self.EACH_GENE_HEIGHT
+ if self.haplotypeAnalystChecked and self.selectedChr > -1:
+ #thisTrait = self.traitList[0]
+ thisTrait = self.this_trait
+ _strains, _vals, _vars = thisTrait.export_informative()
+ smd=[]
+ for ii, _val in enumerate(_vals):
+ temp = GeneralObject(name=_strains[ii], value=_val)
+ smd.append(temp)
+ samplelist = list(self.genotype.prgy)
+ for j,_geno in enumerate (self.genotype[0][1].genotype):
+ for item in smd:
+ if item.name == samplelist[j]:
+ self.NR_INDIVIDUALS = self.NR_INDIVIDUALS + 1
+# default:
+ self.graphHeight = self.graphHeight + 2 * (self.NR_INDIVIDUALS+10) * self.EACH_GENE_HEIGHT
## for paper:
# #self.graphHeight = self.graphHeight + 1 * self.NR_INDIVIDUALS * self.EACH_GENE_HEIGHT - 180
## END HaplotypeAnalyst
@@ -475,53 +495,45 @@ class MarkerRegression(object):
################################################################
# GeneCollection goes here
################################################################
- if self.plotScale == 'physic':
+ if self.plotScale == 'physic' and self.selectedChr != -1:
#StartMb or EndMb
if self.startMb < 0 or self.endMb < 0:
self.startMb = 0
- self.endMb = self.ChrLengthMbList[self.selectedChr]
+ self.endMb = self.ChrLengthMbList[self.selectedChr - 1]
geneTable = ""
- #if self.plotScale == 'physic' and self.selectedChr > -1 and (self.intervalAnalystChecked or self.geneChecked):
- # chrName = self.genotype[0].name
- # # Draw the genes for this chromosome / region of this chromosome
- # if self.traitList and self.traitList[0] and len(self.traitList) == 1 and self.dataset.name:
- # webqtldatabase = self.dataset.name
- # #webqtldatabase = self.traitList[0].db.name
- # else:
- # webqtldatabase = None
- #
- # self.geneCol = None
- #
- # if self.species == "mouse":
- # self.geneCol = GeneUtil.loadGenes(self.cursor, chrName, self.diffCol, self.startMb, self.endMb, webqtldatabase, "mouse")
- # elif self.species == "rat":
- # self.geneCol = GeneUtil.loadGenes(self.cursor, chrName, self.diffCol, self.startMb, self.endMb, webqtldatabase, "rat")
- # else:
- # self.geneCol = None
- #
- # if self.geneCol and self.intervalAnalystChecked:
- # #######################################################################
- # #Nick use GENEID as RefGene to get Literature Correlation Informations#
- # #For Interval Mapping, Literature Correlation isn't useful, so skip it#
- # #through set GENEID is None #
- # #######################################################################
- #
- # #GENEID = fd.formdata.getvalue('GeneId') or None
- # GENEID = None
- #
- # geneTableContainer = HT.Div(Id="sortable") #Div to hold table
- # geneTable = self.geneTable(self.geneCol,GENEID)
- # geneTableContainer.append(geneTable)
- #
- # mainfmName = webqtlUtil.genRandStr("fm_")
- # tableForm = HT.Form(cgi=os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), enctype='multipart/form-data', name=mainfmName, submit=HT.Input(type='hidden'))
- # tableForm.append(HT.Input(name='FormID', value='', type='hidden'))
- # tableForm.append(geneTableContainer)
- #
- #else:
self.geneCol = None
+ if self.plotScale == 'physic' and self.selectedChr > -1 and (self.intervalAnalystChecked or self.geneChecked):
+ chrName = self.selectedChr
+ # Draw the genes for this chromosome / region of this chromosome
+ webqtldatabase = self.dataset.name
+
+ if self.dataset.group.species == "mouse":
+ self.geneCol = GeneUtil.loadGenes(chrName, self.diffCol, self.startMb, self.endMb, webqtldatabase, "mouse")
+ elif self.dataset.group.species == "rat":
+ self.geneCol = GeneUtil.loadGenes(chrName, self.diffCol, self.startMb, self.endMb, webqtldatabase, "rat")
+
+ if self.geneCol and self.intervalAnalystChecked:
+ #######################################################################
+ #Nick use GENEID as RefGene to get Literature Correlation Informations#
+ #For Interval Mapping, Literature Correlation isn't useful, so skip it#
+ #through set GENEID is None #
+ #######################################################################
+
+ #GENEID = fd.formdata.getvalue('GeneId') or None
+ GENEID = None
+
+ geneTableContainer = HT.Div(Id="sortable") #Div to hold table
+ self.geneTable(self.geneCol, GENEID)
+ #geneTable = self.geneTable(self.geneCol, GENEID)
+ #geneTableContainer.append(geneTable)
+
+ #mainfmName = webqtlUtil.genRandStr("fm_")
+ #tableForm = HT.Form(cgi=os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), enctype='multipart/form-data', name=mainfmName, submit=HT.Input(type='hidden'))
+ #tableForm.append(HT.Input(name='FormID', value='', type='hidden'))
+ #tableForm.append(geneTableContainer)
+
################################################################
# Plots goes here
@@ -530,23 +542,23 @@ class MarkerRegression(object):
# showLocusForm = webqtlUtil.genRandStr("fm_")
#else:
showLocusForm = ""
- intCanvas = pid.PILCanvas(size=(self.graphWidth,self.graphHeight))
- gifmap = self.plotIntMapping(intCanvas, startMb = self.startMb, endMb = self.endMb, showLocusForm= showLocusForm)
+ intCanvas = pid.PILCanvas(size=(self.graphWidth, self.graphHeight))
+ gifmap = self.plotIntMapping(intCanvas, startMb = self.startMb, endMb = self.endMb, showLocusForm= showLocusForm)
self.gifmap = gifmap.__str__()
#print("GIFMAP:", gifmap.__str__())
self.filename= webqtlUtil.genRandStr("Itvl_")
- intCanvas.save(os.path.join(webqtlConfig.IMGDIR, self.filename), format='jpeg')
+ intCanvas.save(os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, self.filename), format='jpeg')
intImg=HT.Image('/image/'+self.filename+'.png', border=0, usemap='#WebQTLImageMap')
#Scales plot differently for high resolution
if self.draw2X:
intCanvasX2 = pid.PILCanvas(size=(self.graphWidth*2,self.graphHeight*2))
gifmapX2 = self.plotIntMapping(intCanvasX2, startMb = self.startMb, endMb = self.endMb, showLocusForm= showLocusForm, zoom=2)
- intCanvasX2.save(os.path.join(webqtlConfig.IMGDIR, self.filename+"X2"), format='png')
+ intCanvasX2.save(os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, self.filename+"X2"), format='png')
#DLintImgX2=HT.Href(text='Download',url = '/image/'+self.filename+'X2.png', Class='smallsize', target='_blank')
-
+
#textUrl = self.writeQTL2Text(fd, self.filename)
################################################################
@@ -576,28 +588,28 @@ class MarkerRegression(object):
showLocusForm.append(intImg)
else:
showLocusForm = intImg
-
- if self.permChecked and not self.multipleInterval and 0<self.nperm:
- perm_histogram = self.drawPermutationHistogram()
- perm_text_file = self.permutationTextFile()
+
+ if self.permChecked and self.nperm > 0 and not self.multipleInterval and 0 < self.nperm:
+ self.perm_filename = self.drawPermutationHistogram()
+ #perm_text_file = self.permutationTextFile()
################################################################
# footnote goes here
################################################################
btminfo = HT.Paragraph(Id="smallsize") #Small('More information about this graph is available here.')
- if (self.additiveChecked):
- btminfo.append(HT.BR(), 'A positive additive coefficient (', HT.Font('green', color='green'), ' line) indicates that %s alleles increase trait values. In contrast, a negative additive coefficient (' % fd.ppolar, HT.Font('red', color='red'), ' line) indicates that %s alleles increase trait values.' % fd.mpolar)
+ #if (self.additiveChecked):
+ # btminfo.append(HT.BR(), 'A positive additive coefficient (', HT.Font('green', color='green'), ' line) indicates that %s alleles increase trait values. In contrast, a negative additive coefficient (' % fd.ppolar, HT.Font('red', color='red'), ' line) indicates that %s alleles increase trait values.' % fd.mpolar)
if self.traitList and self.traitList[0].dataset and self.traitList[0].dataset.type == 'Geno':
btminfo.append(HT.BR(), 'Mapping using genotype data as a trait will result in infinity LRS at one locus. In order to display the result properly, all LRSs higher than 100 are capped at 100.')
- if self.permChecked and not self.multipleInterval and 0<self.nperm:
- TD_LR = HT.TD(HT.Blockquote(gifmap, showLocusForm, HT.P(), btminfo, HT.P(), perm_histogram, HT.P(), perm_text_file), bgColor='#eeeeee', height = 200)
- #TD_LR = HT.TD(HT.Blockquote(topTable), HT.Blockquote(gifmap, showLocusForm, HT.P(), btminfo, HT.P(), perm_histogram, HT.P(), perm_text_file), bgColor='#eeeeee', height = 200)
- else:
- TD_LR = HT.TD(HT.Blockquote(gifmap, showLocusForm, HT.P(), btminfo), bgColor='#eeeeee', height = 200)
- #TD_LR = HT.TD(HT.Blockquote(topTable), HT.Blockquote(gifmap, showLocusForm, HT.P(), btminfo, HT.P(), perm_histogram, HT.P(), perm_text_file), bgColor='#eeeeee', height = 200)
+ #if self.permChecked and not self.multipleInterval and 0 < self.nperm:
+ # TD_LR = HT.TD(HT.Blockquote(gifmap, showLocusForm, HT.P(), btminfo, HT.P(), perm_histogram, HT.P(), perm_text_file), bgColor='#eeeeee', height = 200)
+ # #TD_LR = HT.TD(HT.Blockquote(topTable), HT.Blockquote(gifmap, showLocusForm, HT.P(), btminfo, HT.P(), perm_histogram, HT.P(), perm_text_file), bgColor='#eeeeee', height = 200)
+ #else:
+ TD_LR = HT.TD(HT.Blockquote(gifmap, showLocusForm, HT.P(), btminfo), bgColor='#eeeeee', height = 200)
+ #TD_LR = HT.TD(HT.Blockquote(topTable), HT.Blockquote(gifmap, showLocusForm, HT.P(), btminfo, HT.P(), perm_histogram, HT.P(), perm_text_file), bgColor='#eeeeee', height = 200)
if geneTable:
@@ -646,7 +658,7 @@ class MarkerRegression(object):
TD_LR.append(HT.Blockquote(tableForm))
self.body = TD_LR
-
+
#self.dict['body'] = TD_LR
#self.dict['title'] = "Mapping"
@@ -662,12 +674,12 @@ class MarkerRegression(object):
fpText.write("Source: WebQTL, The GeneNetwork (%s)\n" % webqtlConfig.PORTADDR)
#
- fpText.write("Site: %s\n" % webqtlConfig.SITENAME)
+ fpText.write("Site: GN\n")
fpText.write("Page: Map Viewer\n")
fpText.write(time.strftime("Date and Time (US Center): %b %d, %Y at %I.%M %p\n", time.localtime()))
fpText.write("Trait ID: %s\n" % self.this_trait.name)
fpText.write("Suggestive LRS = %0.2f\n" % self.suggestive)
- fpText.write("Significant LRS = %0.2f\n" % self.significance)
+ fpText.write("Significant LRS = %0.2f\n" % self.significant)
"""
if self.this_trait.symbol and self.this_trait.chr and self.this_trait.mb:
writeSymbol, writeChromosome, writeMb = self.this_trait.symbol, self.this_trait.chr, self.this_trait.mb
@@ -704,7 +716,7 @@ class MarkerRegression(object):
else:
lrs_lod = marker['lod_score']
- P_value = self.calculatePValue(lrs_lod, self.LRSArray)
+ P_value = self.calculatePValue(lrs_lod, self.perm_output)
#if _dominance:
# fpText.write("%s\t%s\t%2.3f\t%s\t%2.3f\t%2.3f\t%2.3f\t%2.3f\n" %(qtlresult.locus.chr, \
@@ -789,8 +801,8 @@ class MarkerRegression(object):
plotXScale = self.drawGraphBackground(canvas, gifmap, offset=newoffset, zoom= zoom, startMb=startMb, endMb = endMb)
#draw bootstap
- #if self.bootChecked and not self.multipleInterval:
- # self.drawBootStrapResult(canvas, fd.nboot, drawAreaHeight, plotXScale, offset=newoffset)
+ if self.bootChecked and not self.multipleInterval:
+ self.drawBootStrapResult(canvas, self.nboot, drawAreaHeight, plotXScale, offset=newoffset)
# Draw clickable region and gene band if selected
if self.plotScale == 'physic' and self.selectedChr > -1:
@@ -812,7 +824,7 @@ class MarkerRegression(object):
if self.multipleInterval:
self.drawMultiTraitName(fd, canvas, gifmap, showLocusForm, offset=newoffset)
elif self.legendChecked:
- self.drawLegendPanel(fd, canvas, offset=newoffset, zoom = zoom)
+ self.drawLegendPanel(canvas, offset=newoffset, zoom = zoom)
else:
pass
@@ -837,16 +849,30 @@ class MarkerRegression(object):
BootCoord = []
i = 0
startX = xLeftOffset
- for j, _chr in enumerate(self.genotype):
- BootCoord.append( [])
- for _locus in _chr:
- if self.plotScale == 'physic':
- Xc = startX + (_locus.Mb-self.startMb)*plotXScale
- else:
- Xc = startX + (_locus.cM-_chr[0].cM)*plotXScale
- BootCoord[-1].append([Xc, self.bootResult[i]])
- i += 1
- startX += (self.ChrLengthDistList[j] + self.GraphInterval)*plotXScale
+
+ if self.selectedChr == -1: #ZS: If viewing full genome/all chromosomes
+ for j, _chr in enumerate(self.genotype):
+ BootCoord.append( [])
+ for _locus in _chr:
+ if self.plotScale == 'physic':
+ Xc = startX + (_locus.Mb-self.startMb)*plotXScale
+ else:
+ Xc = startX + (_locus.cM-_chr[0].cM)*plotXScale
+ BootCoord[-1].append([Xc, self.bootResult[i]])
+ i += 1
+ startX += (self.ChrLengthDistList[j] + self.GraphInterval)*plotXScale
+ else:
+ for j, _chr in enumerate(self.genotype):
+ if _chr.name == self.ChrList[self.selectedChr][0]:
+ BootCoord.append( [])
+ for _locus in _chr:
+ if _chr.name == self.ChrList[self.selectedChr][0]:
+ if self.plotScale == 'physic':
+ Xc = startX + (_locus.Mb-self.startMb)*plotXScale
+ else:
+ Xc = startX + (_locus.cM-_chr[0].cM)*plotXScale
+ BootCoord[-1].append([Xc, self.bootResult[i]])
+ i += 1
#reduce bootResult
if self.selectedChr > -1:
@@ -1018,14 +1044,14 @@ class MarkerRegression(object):
SNPCounts = []
while startMb<endMb:
- self.cursor.execute("""
+ snp_count = g.db.execute("""
select
count(*) from BXDSnpPosition
where
Chr = '%s' AND Mb >= %2.6f AND Mb < %2.6f AND
StrainId1 = %d AND StrainId2 = %d
- """ % (chrName, startMb, startMb+stepMb, strainId1, strainId2))
- SNPCounts.append(self.cursor.fetchone()[0])
+ """ % (chrName, startMb, startMb+stepMb, strainId1, strainId2)).fetchone()[0]
+ SNPCounts.append(snp_count)
startMb += stepMb
if (len(SNPCounts) > 0):
@@ -1070,7 +1096,7 @@ class MarkerRegression(object):
gifmap.areas.append(Areas)
- def drawLegendPanel(self, fd, canvas, offset= (40, 120, 80, 10), zoom = 1, locLocation= None):
+ def drawLegendPanel(self, canvas, offset= (40, 120, 80, 10), zoom = 1, locLocation= None):
xLeftOffset, xRightOffset, yTopOffset, yBottomOffset = offset
plotWidth = canvas.size[0] - xLeftOffset - xRightOffset
plotHeight = canvas.size[1] - yTopOffset - yBottomOffset
@@ -1079,7 +1105,6 @@ class MarkerRegression(object):
if zoom == 2:
fontZoom = 1.5
-
labelFont=pid.Font(ttf="trebuc",size=12*fontZoom, bold=1)
startPosY = 15
stepPosY = 12*fontZoom
@@ -1109,7 +1134,7 @@ class MarkerRegression(object):
canvas.drawLine(startPosX+54,startPosY,startPosX+67,startPosY,color=self.HAPLOTYPE_RECOMBINATION, width=4)
canvas.drawString('Haplotypes (Pat, Mat, Het, Unk)',startPosX+76,startPosY+5,font=labelFont,color=pid.black)
- if self.permChecked:
+ if self.permChecked and self.nperm > 0:
startPosY += stepPosY
startPosX = xLeftOffset
canvas.drawLine(startPosX, startPosY, startPosX + 32, startPosY, color=self.SIGNIFICANT_COLOR, width=self.SIGNIFICANT_WIDTH)
@@ -1117,24 +1142,22 @@ class MarkerRegression(object):
lod = 1
if self.LRS_LOD == 'LOD':
lod = self.LODFACTOR
- canvas.drawString('Significant %s = %2.2f' % (self.LRS_LOD, self.significance/lod),xLeftOffset+42,startPosY +5,font=labelFont,color=pid.black)
- canvas.drawString('Suggestive %s = %2.2f' % (self.LRS_LOD, self.suggestive/lod),xLeftOffset+42,startPosY + 5 +stepPosY,font=labelFont,color=pid.black)
-
-
+ canvas.drawString('Significant %s = %2.2f' % (self.LRS_LOD, self.significant),xLeftOffset+42,startPosY +5,font=labelFont,color=pid.black)
+ canvas.drawString('Suggestive %s = %2.2f' % (self.LRS_LOD, self.suggestive),xLeftOffset+42,startPosY + 5 +stepPosY,font=labelFont,color=pid.black)
labelFont=pid.Font(ttf="verdana",size=12*fontZoom)
labelColor = pid.black
if self.selectedChr == -1:
- string1 = 'Mapping for Dataset: %s, mapping on All Chromosomes' % fd.RISet
+ string1 = 'Mapping for Dataset: %s, mapping on All Chromosomes' % self.dataset.group.name
else:
- string1 = 'Mapping for Dataset: %s, mapping on Chromosome %s' % (fd.RISet,self.genotype[0].name)
- if self.controlLocus:
+ string1 = 'Mapping for Dataset: %s, mapping on Chromosome %s' % (self.dataset.group.name, self.ChrList[self.selectedChr][0])
+ if self.controlLocus and self.doControl != "false":
string2 = 'Using %s as control' % self.controlLocus
else:
string2 = 'Using Haldane mapping function with no control for other QTLs'
d = 4+ max(canvas.stringWidth(string1,font=labelFont),canvas.stringWidth(string2,font=labelFont))
- if fd.identification:
- identification = "Trait ID: %s" % fd.identification
+ if self.this_trait.name:
+ identification = "Trait ID: %s : %s" % (self.dataset.fullname, self.this_trait.name)
canvas.drawString(identification,canvas.size[0] - xRightOffset-d,20*fontZoom,font=labelFont,color=labelColor)
canvas.drawString(string1,canvas.size[0] - xRightOffset-d,35*fontZoom,font=labelFont,color=labelColor)
@@ -1160,7 +1183,7 @@ class MarkerRegression(object):
for gIndex, theGO in enumerate(self.geneCol):
geneNCBILink = 'http://www.ncbi.nlm.nih.gov/gene?term=%s'
- if self.species == "mouse":
+ if self.dataset.group.species == "mouse":
txStart = theGO["TxStart"]
txEnd = theGO["TxEnd"]
geneLength = (txEnd - txStart)*1000.0
@@ -1219,7 +1242,7 @@ class MarkerRegression(object):
# NL: 06-02-2011 Rob required to change this link for gene related
HREF=geneNCBILink %geneSymbol
- elif self.species == "rat":
+ elif self.dataset.group.species == "rat":
exonStarts = []
exonEnds = []
txStart = theGO["TxStart"]
@@ -1271,7 +1294,11 @@ class MarkerRegression(object):
canvas.drawLine(geneStartPix, geneYLocation + self.EACH_GENE_HEIGHT/2*zoom, geneEndPix, geneYLocation + self.EACH_GENE_HEIGHT/2*zoom, color=outlineColor, width=1)
#draw the arrows
- for xCoord in range(0, geneEndPix-geneStartPix):
+ if geneEndPix - geneStartPix < 1:
+ genePixRange = 1
+ else:
+ genePixRange = int(geneEndPix - geneStartPix)
+ for xCoord in range(0, genePixRange):
if (xCoord % self.EACH_GENE_ARROW_SPACING == 0 and xCoord + self.EACH_GENE_ARROW_SPACING < geneEndPix-geneStartPix) or xCoord == 0:
if strand == "+":
@@ -1351,7 +1378,6 @@ class MarkerRegression(object):
if self.plotScale != 'physic' or self.selectedChr == -1 or not self.geneCol:
return
-
fpText = open(os.path.join(webqtlConfig.TMPDIR, "hallo") + '.txt','wb')
clickableRegionLabelFont=pid.Font(ttf="verdana", size=9, bold=0)
@@ -1367,18 +1393,21 @@ class MarkerRegression(object):
exprdrawn = 0
- thisTrait = self.traitList[0]
- _strains, _vals, _vars = thisTrait.exportInformative()
+ #thisTrait = self.traitList[0]
+ thisTrait = self.this_trait
+ _strains, _vals, _vars = thisTrait.export_informative()
smd=[]
for ii, _val in enumerate(_vals):
- temp = GeneralObject(name=_strains[ii], value=_val)
- smd.append(temp)
+ if _strains[ii] in self.dataset.group.samplelist:
+ temp = GeneralObject(name=_strains[ii], value=_val)
+ smd.append(temp)
+
smd.sort(lambda A, B: cmp(A.value, B.value))
smd.reverse()
- bxdlist=list(self.genotype.prgy)
+ samplelist = list(self.genotype.prgy)
oldgeneEndPix = -1
#Initializing plotRight, error before
@@ -1477,7 +1506,7 @@ class MarkerRegression(object):
plotbxd=0
for item in smd:
- if item.name == bxdlist[j]:
+ if item.name == samplelist[j]:
plotbxd=1
if (plotbxd == 1):
@@ -1485,7 +1514,7 @@ class MarkerRegression(object):
counter = 0
for item in smd:
counter = counter + 1
- if item.name == bxdlist[j]:
+ if item.name == samplelist[j]:
ind = counter
maxind=max(ind,maxind)
@@ -1508,7 +1537,7 @@ class MarkerRegression(object):
COORDS = "%d, %d, %d, %d" %(geneStartPix, geneYLocation+ind*self.EACH_GENE_HEIGHT, geneEndPix+1, (geneYLocation + ind*self.EACH_GENE_HEIGHT))
- TITLE = "Strain: %s, marker (%s) \n Position %2.3f Mb." % (bxdlist[j], self.genotype[0][i].name, float(txStart))
+ TITLE = "Strain: %s, marker (%s) \n Position %2.3f Mb." % (samplelist[j], self.genotype[0][i].name, float(txStart))
HREF = ''
gifmap.areas.append(HT.Area(shape='rect',coords=COORDS,href=HREF, title=TITLE))
@@ -1529,11 +1558,11 @@ class MarkerRegression(object):
else:
lastGene = 0
- for j,_geno in enumerate (self.genotype[0][1].genotype):
+ for j, _geno in enumerate (self.genotype[0][1].genotype):
plotbxd=0
for item in smd:
- if item.name == bxdlist[j]:
+ if item.name == samplelist[j]:
plotbxd=1
if (plotbxd == 1):
@@ -1543,12 +1572,12 @@ class MarkerRegression(object):
expr = 0
for item in smd:
counter = counter + 1
- if item.name == bxdlist[j]:
+ if item.name == samplelist[j]:
ind = counter
expr = item.value
# Place where font is hardcoded
- canvas.drawString("%s" % (bxdlist[j]), (xLeftOffset + plotWidth + 10) , geneYLocation+8+2*ind*self.EACH_GENE_HEIGHT*zoom, font=pid.Font(ttf="verdana", size=12, bold=0), color=pid.black)
+ canvas.drawString("%s" % (samplelist[j]), (xLeftOffset + plotWidth + 10) , geneYLocation+8+2*ind*self.EACH_GENE_HEIGHT*zoom, font=pid.Font(ttf="verdana", size=12, bold=0), color=pid.black)
canvas.drawString("%2.2f" % (expr), (xLeftOffset + plotWidth + 60) , geneYLocation+8+2*ind*self.EACH_GENE_HEIGHT*zoom, font=pid.Font(ttf="verdana", size=12, bold=0), color=pid.black)
fpText.close()
@@ -1582,43 +1611,43 @@ class MarkerRegression(object):
currentChromosome = self.genotype[0].name
i = 0
-
+
paddingTop = yTopOffset
ucscPaddingTop = paddingTop + self.WEBQTL_BAND_HEIGHT + self.BAND_SPACING
ensemblPaddingTop = ucscPaddingTop + self.UCSC_BAND_HEIGHT + self.BAND_SPACING
-
+
if zoom == 1:
for pixel in range(xLeftOffset, xLeftOffset + plotWidth, pixelStep):
-
+
calBase = self.kONE_MILLION*(startMb + (endMb-startMb)*(pixel-xLeftOffset-0.0)/plotWidth)
-
+
xBrowse1 = pixel
xBrowse2 = min(xLeftOffset + plotWidth, (pixel + pixelStep - 1))
-
+
WEBQTL_COORDS = "%d, %d, %d, %d" % (xBrowse1, paddingTop, xBrowse2, (paddingTop+self.WEBQTL_BAND_HEIGHT))
bandWidth = xBrowse2 - xBrowse1
- WEBQTL_HREF = "javascript:centerIntervalMapOnRange2('%s', %f, %f, document.changeViewForm)" % (currentChromosome, max(0, (calBase-webqtlZoomWidth))/1000000.0, (calBase+webqtlZoomWidth)/1000000.0)
-
+ WEBQTL_HREF = "javascript:rangeView('%s', %f, %f)" % (self.selectedChr - 1, max(0, (calBase-webqtlZoomWidth))/1000000.0, (calBase+webqtlZoomWidth)/1000000.0)
+
WEBQTL_TITLE = "Click to view this section of the genome in WebQTL"
gifmap.areas.append(HT.Area(shape='rect',coords=WEBQTL_COORDS,href=WEBQTL_HREF, title=WEBQTL_TITLE))
canvas.drawRect(xBrowse1, paddingTop, xBrowse2, (paddingTop + self.WEBQTL_BAND_HEIGHT), edgeColor=self.CLICKABLE_WEBQTL_REGION_COLOR, fillColor=self.CLICKABLE_WEBQTL_REGION_COLOR)
canvas.drawLine(xBrowse1, paddingTop, xBrowse1, (paddingTop + self.WEBQTL_BAND_HEIGHT), color=self.CLICKABLE_WEBQTL_REGION_OUTLINE_COLOR)
-
+
UCSC_COORDS = "%d, %d, %d, %d" %(xBrowse1, ucscPaddingTop, xBrowse2, (ucscPaddingTop+self.UCSC_BAND_HEIGHT))
- if self.species == "mouse":
- UCSC_HREF = "http://genome.ucsc.edu/cgi-bin/hgTracks?db=%s&position=chr%s:%d-%d&hgt.customText=%s/snp/chr%s" % (self._ucscDb, currentChromosome, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases, webqtlConfig.PORTADDR, currentChromosome)
+ if self.dataset.group.species == "mouse":
+ UCSC_HREF = "http://genome.ucsc.edu/cgi-bin/hgTracks?db=%s&position=chr%s:%d-%d&hgt.customText=%s/snp/chr%s" % (self._ucscDb, self.selectedChr, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases, webqtlConfig.PORTADDR, self.selectedChr)
else:
- UCSC_HREF = "http://genome.ucsc.edu/cgi-bin/hgTracks?db=%s&position=chr%s:%d-%d" % (self._ucscDb, currentChromosome, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases)
+ UCSC_HREF = "http://genome.ucsc.edu/cgi-bin/hgTracks?db=%s&position=chr%s:%d-%d" % (self._ucscDb, self.selectedChr, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases)
UCSC_TITLE = "Click to view this section of the genome in the UCSC Genome Browser"
gifmap.areas.append(HT.Area(shape='rect',coords=UCSC_COORDS,href=UCSC_HREF, title=UCSC_TITLE))
canvas.drawRect(xBrowse1, ucscPaddingTop, xBrowse2, (ucscPaddingTop+self.UCSC_BAND_HEIGHT), edgeColor=self.CLICKABLE_UCSC_REGION_COLOR, fillColor=self.CLICKABLE_UCSC_REGION_COLOR)
canvas.drawLine(xBrowse1, ucscPaddingTop, xBrowse1, (ucscPaddingTop+self.UCSC_BAND_HEIGHT), color=self.CLICKABLE_UCSC_REGION_OUTLINE_COLOR)
-
+
ENSEMBL_COORDS = "%d, %d, %d, %d" %(xBrowse1, ensemblPaddingTop, xBrowse2, (ensemblPaddingTop+self.ENSEMBL_BAND_HEIGHT))
- if self.species == "mouse":
- ENSEMBL_HREF = "http://www.ensembl.org/Mus_musculus/contigview?highlight=&chr=%s&vc_start=%d&vc_end=%d&x=35&y=12" % (currentChromosome, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases)
+ if self.dataset.group.species == "mouse":
+ ENSEMBL_HREF = "http://www.ensembl.org/Mus_musculus/contigview?highlight=&chr=%s&vc_start=%d&vc_end=%d&x=35&y=12" % (self.selectedChr, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases)
else:
- ENSEMBL_HREF = "http://www.ensembl.org/Rattus_norvegicus/contigview?chr=%s&start=%d&end=%d" % (currentChromosome, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases)
+ ENSEMBL_HREF = "http://www.ensembl.org/Rattus_norvegicus/contigview?chr=%s&start=%d&end=%d" % (self.selectedChr, max(0, calBase-flankingWidthInBases), calBase+flankingWidthInBases)
ENSEMBL_TITLE = "Click to view this section of the genome in the Ensembl Genome Browser"
gifmap.areas.append(HT.Area(shape='rect',coords=ENSEMBL_COORDS,href=ENSEMBL_HREF, title=ENSEMBL_TITLE))
canvas.drawRect(xBrowse1, ensemblPaddingTop, xBrowse2, (ensemblPaddingTop+self.ENSEMBL_BAND_HEIGHT), edgeColor=self.CLICKABLE_ENSEMBL_REGION_COLOR, fillColor=self.CLICKABLE_ENSEMBL_REGION_COLOR)
@@ -1632,8 +1661,8 @@ class MarkerRegression(object):
#draw the gray text
chrFont = pid.Font(ttf="verdana", size=26*zoom, bold=1)
traitFont = pid.Font(ttf="verdana", size=14, bold=0)
- chrX = xLeftOffset + plotWidth - 2 - canvas.stringWidth("Chr %s" % currentChromosome, font=chrFont)
- canvas.drawString("Chr %s" % currentChromosome, chrX, ensemblPaddingTop-5, font=chrFont, color=pid.gray)
+ chrX = xLeftOffset + plotWidth - 2 - canvas.stringWidth("Chr %s" % self.ChrList[self.selectedChr][0], font=chrFont)
+ canvas.drawString("Chr %s" % self.ChrList[self.selectedChr][0], chrX, ensemblPaddingTop-5, font=chrFont, color=pid.gray)
traitX = chrX - 28 - canvas.stringWidth("database", font=traitFont)
# end of drawBrowserClickableRegions
else:
@@ -1728,7 +1757,9 @@ class MarkerRegression(object):
ChrAInfo = []
preLpos = -1
distinctCount = 0.0
- if len(self.genotype) > 1:
+
+ #if len(self.genotype) > 1:
+ if self.selectedChr == -1: #ZS: If viewing full genome/all chromosomes
for i, _chr in enumerate(self.genotype):
thisChr = []
Locus0CM = _chr[0].cM
@@ -1751,15 +1782,16 @@ class MarkerRegression(object):
ChrAInfo.append(thisChr)
else:
for i, _chr in enumerate(self.genotype):
- thisChr = []
- Locus0CM = _chr[0].cM
- for _locus in _chr:
- if _locus.name != ' - ':
- if _locus.cM != preLpos:
- distinctCount += 1
- preLpos = _locus.cM
- thisChr.append([_locus.name, _locus.cM-Locus0CM])
- ChrAInfo.append(thisChr)
+ if _chr.name == self.ChrList[self.selectedChr][0]:
+ thisChr = []
+ Locus0CM = _chr[0].cM
+ for _locus in _chr:
+ if _locus.name != ' - ':
+ if _locus.cM != preLpos:
+ distinctCount += 1
+ preLpos = _locus.cM
+ thisChr.append([_locus.name, _locus.cM-Locus0CM])
+ ChrAInfo.append(thisChr)
stepA = (plotWidth+0.0)/distinctCount
@@ -1768,8 +1800,8 @@ class MarkerRegression(object):
offsetA = -stepA
lineColor = pid.lightblue
startPosX = xLeftOffset
+
for j, ChrInfo in enumerate(ChrAInfo):
- if ChrInfo == self.selectedChr:
preLpos = -1
for i, item in enumerate(ChrInfo):
Lname,Lpos = item
@@ -1801,7 +1833,7 @@ class MarkerRegression(object):
xLeftOffset+offsetA,yZero+40+Zorder*(LRectWidth+3)+LRectWidth)
HREF="/show_trait?trait_id=%s&dataset=%s" % (Lname, self.dataset.group.name+"Geno")
#HREF="javascript:showDatabase3('%s','%s','%s','');" % (showLocusForm,fd.RISet+"Geno", Lname)
- Areas=HT.Area(shape='rect',coords=COORDS,href=HREF, title="Locus : " + Lname)
+ Areas=HT.Area(shape='rect', coords=COORDS, href=HREF, target="_blank", title="Locus : " + Lname)
gifmap.areas.append(Areas)
##piddle bug
if j == 0:
@@ -1827,44 +1859,66 @@ class MarkerRegression(object):
#draw the LRS scale
#We first determine whether or not we are using a sliding scale.
- #If so, we need to compute the maximum LRS value to determine where the max y-value should be, and call this LRSMax.
- #LRSTop is then defined to be above the LRSMax by enough to add one additional LRSScale increment.
- #if we are using a set-scale, then we set LRSTop to be the user's value, and LRSMax doesn't matter.
+ #If so, we need to compute the maximum LRS value to determine where the max y-value should be, and call this LRS_LOD_Max.
+ #LRSTop is then defined to be above the LRS_LOD_Max by enough to add one additional LRSScale increment.
+ #if we are using a set-scale, then we set LRSTop to be the user's value, and LRS_LOD_Max doesn't matter.
- if self.LRS_LOD == 'LOD':
- lodm = self.LODFACTOR
- else:
- lodm = 1.0
-
+ #ZS: I'm not sure what this if statement is supposed to do. It appears to work correctly for both LOD and LRS if I just set lodm to 1.0
+ # if self.LRS_LOD == 'LRS':
+ # lodm = self.LODFACTOR
+ # else:
+ # lodm = 1.0
+
+ #ZS: This is a mess, but I don't know a better way to account for different mapping methods returning results in different formats + the option to change between LRS and LOD
if self.lrsMax <= 0: #sliding scale
if "lrs_value" in self.qtlresults[0]:
- LRSMax = max([result['lrs_value'] for result in self.qtlresults])
- #LRSMax = max(map(max, self.qtlresults)).lrs_value
- else:
- LRSMax = max([result['lod_score'] for result in self.qtlresults])
- #LRSMax = max(map(max, self.qtlresults)).lod_score
+ LRS_LOD_Max = max([result['lrs_value'] for result in self.qtlresults])
+ if self.LRS_LOD == "LOD":
+ LRS_LOD_Max = LRS_LOD_Max / self.LODFACTOR
+ if self.permChecked and self.nperm > 0 and not self.multipleInterval:
+ self.significant = min(self.significant / self.LODFACTOR, webqtlConfig.MAXLRS)
+ self.suggestive = min(self.suggestive / self.LODFACTOR, webqtlConfig.MAXLRS)
+ else:
+ if self.permChecked and self.nperm > 0 and not self.multipleInterval:
+ self.significant = min(self.significant, webqtlConfig.MAXLRS)
+ self.suggestive = min(self.suggestive, webqtlConfig.MAXLRS)
+ else:
+ pass
+ else:
+ LRS_LOD_Max = max([result['lod_score'] for result in self.qtlresults])
+ if self.LRS_LOD == "LRS":
+ LRS_LOD_Max = LRS_LOD_Max * self.LODFACTOR
+ if self.permChecked and self.nperm > 0 and not self.multipleInterval:
+ self.significant = min(self.significant * self.LODFACTOR, webqtlConfig.MAXLRS)
+ self.suggestive = min(self.suggestive * self.LODFACTOR, webqtlConfig.MAXLRS)
+ else:
+ if self.permChecked and self.nperm > 0 and not self.multipleInterval:
+ self.significant = min(self.significant, webqtlConfig.MAXLRS)
+ self.suggestive = min(self.suggestive, webqtlConfig.MAXLRS)
+ else:
+ pass
+
+ if self.permChecked and self.nperm > 0 and not self.multipleInterval:
+ LRS_LOD_Max = max(self.significant, LRS_LOD_Max)
+
#genotype trait will give infinite LRS
- LRSMax = min(LRSMax, webqtlConfig.MAXLRS)
- if self.permChecked and not self.multipleInterval:
- self.significance = min(self.significance, webqtlConfig.MAXLRS)
- self.suggestive = min(self.suggestive, webqtlConfig.MAXLRS)
- LRSMax = max(self.significance, LRSMax)
+ LRS_LOD_Max = min(LRS_LOD_Max, webqtlConfig.MAXLRS)
else:
- LRSMax = self.lrsMax*lodm
+ LRS_LOD_Max = self.lrsMax
- if LRSMax/lodm > 100:
+ if LRS_LOD_Max > 100:
LRSScale = 20.0
- elif LRSMax/lodm > 20:
+ elif LRS_LOD_Max > 20:
LRSScale = 5.0
- elif LRSMax/lodm > 7.5:
+ elif LRS_LOD_Max > 7.5:
LRSScale = 2.5
else:
LRSScale = 1.0
- LRSAxisList = Plot.frange(LRSScale, LRSMax/lodm, LRSScale)
+ LRSAxisList = Plot.frange(LRSScale, LRS_LOD_Max, LRSScale)
#make sure the user's value appears on the y-axis
- #update by NL 6-21-2011: round the LOD value to 100 when LRSMax is equal to 460
- LRSAxisList.append(round(LRSMax/lodm))
+ #update by NL 6-21-2011: round the LOD value to 100 when LRS_LOD_Max is equal to 460
+ LRSAxisList.append(round(LRS_LOD_Max))
#draw the "LRS" or "LOD" string to the left of the axis
LRSScaleFont=pid.Font(ttf="verdana", size=16*zoom, bold=0)
@@ -1875,53 +1929,66 @@ class MarkerRegression(object):
yZero - 150 - 300*(zoom - 1), font=LRSLODFont, color=pid.black, angle=90)
for item in LRSAxisList:
- if LRSMax == 0.0:
- LRSMax = 0.000001
- yLRS = yZero - (item*lodm/LRSMax) * LRSHeightThresh
+ if LRS_LOD_Max == 0.0:
+ LRS_LOD_Max = 0.000001
+ yLRS = yZero - (item/LRS_LOD_Max) * LRSHeightThresh
canvas.drawLine(xLeftOffset, yLRS, xLeftOffset - 4, yLRS, color=self.LRS_COLOR, width=1*zoom)
scaleStr = "%2.1f" % item
#Draw the LRS/LOD Y axis label
canvas.drawString(scaleStr, xLeftOffset-4-canvas.stringWidth(scaleStr, font=LRSScaleFont)-5, yLRS+3, font=LRSScaleFont, color=self.LRS_COLOR)
-
- #"Significant" and "Suggestive" Drawing Routine
- # ======= Draw the thick lines for "Significant" and "Suggestive" ===== (crowell: I tried to make the SNPs draw over these lines, but piddle wouldn't have it...)
- if self.permChecked and not self.multipleInterval:
- significantY = yZero - self.significance*LRSHeightThresh/LRSMax
- suggestiveY = yZero - self.suggestive*LRSHeightThresh/LRSMax
+ if self.permChecked and self.nperm > 0 and not self.multipleInterval:
+ significantY = yZero - self.significant*LRSHeightThresh/LRS_LOD_Max
+ suggestiveY = yZero - self.suggestive*LRSHeightThresh/LRS_LOD_Max
startPosX = xLeftOffset
- for i, _chr in enumerate(self.genotype):
- rightEdge = int(startPosX + self.ChrLengthDistList[i]*plotXScale - self.SUGGESTIVE_WIDTH/1.5)
- canvas.drawLine(startPosX+self.SUGGESTIVE_WIDTH/1.5, suggestiveY, rightEdge, suggestiveY, color=self.SUGGESTIVE_COLOR,
+
+ #"Significant" and "Suggestive" Drawing Routine
+ # ======= Draw the thick lines for "Significant" and "Suggestive" ===== (crowell: I tried to make the SNPs draw over these lines, but piddle wouldn't have it...)
+
+ #ZS: I don't know if what I did here with this inner function is clever or overly complicated, but it's the only way I could think of to avoid duplicating the code inside this function
+ def add_suggestive_significant_lines_and_legend(start_pos_x, chr_length_dist):
+ rightEdge = int(start_pos_x + chr_length_dist*plotXScale - self.SUGGESTIVE_WIDTH/1.5)
+ canvas.drawLine(start_pos_x+self.SUGGESTIVE_WIDTH/1.5, suggestiveY, rightEdge, suggestiveY, color=self.SUGGESTIVE_COLOR,
width=self.SUGGESTIVE_WIDTH*zoom, clipX=(xLeftOffset, xLeftOffset + plotWidth-2))
- canvas.drawLine(startPosX+self.SUGGESTIVE_WIDTH/1.5, significantY, rightEdge, significantY, color=self.SIGNIFICANT_COLOR,
+ canvas.drawLine(start_pos_x+self.SUGGESTIVE_WIDTH/1.5, significantY, rightEdge, significantY, color=self.SIGNIFICANT_COLOR,
width=self.SIGNIFICANT_WIDTH*zoom, clipX=(xLeftOffset, xLeftOffset + plotWidth-2))
- sugg_coords = "%d, %d, %d, %d" % (startPosX, suggestiveY-2, rightEdge + 2*zoom, suggestiveY+2)
- sig_coords = "%d, %d, %d, %d" % (startPosX, significantY-2, rightEdge + 2*zoom, significantY+2)
+ sugg_coords = "%d, %d, %d, %d" % (start_pos_x, suggestiveY-2, rightEdge + 2*zoom, suggestiveY+2)
+ sig_coords = "%d, %d, %d, %d" % (start_pos_x, significantY-2, rightEdge + 2*zoom, significantY+2)
if self.LRS_LOD == 'LRS':
sugg_title = "Suggestive LRS = %0.2f" % self.suggestive
- sig_title = "Significant LRS = %0.2f" % self.significance
+ sig_title = "Significant LRS = %0.2f" % self.significant
else:
sugg_title = "Suggestive LOD = %0.2f" % (self.suggestive/4.61)
- sig_title = "Significant LOD = %0.2f" % (self.significance/4.61)
+ sig_title = "Significant LOD = %0.2f" % (self.significant/4.61)
Areas1 = HT.Area(shape='rect',coords=sugg_coords,title=sugg_title)
Areas2 = HT.Area(shape='rect',coords=sig_coords,title=sig_title)
gifmap.areas.append(Areas1)
gifmap.areas.append(Areas2)
- startPosX += (self.ChrLengthDistList[i]+self.GraphInterval)*plotXScale
+ start_pos_x += (chr_length_dist+self.GraphInterval)*plotXScale
+ return start_pos_x
+ for i, _chr in enumerate(self.genotype):
+ if self.selectedChr != -1:
+ if _chr.name == self.ChrList[self.selectedChr][0]:
+ startPosX = add_suggestive_significant_lines_and_legend(startPosX, self.ChrLengthDistList[0])
+ break
+ else:
+ continue
+ else:
+ startPosX = add_suggestive_significant_lines_and_legend(startPosX, self.ChrLengthDistList[i])
if self.multipleInterval:
lrsEdgeWidth = 1
else:
- #additiveMax = max(map(lambda X : abs(X.additive), self.qtlresults[0]))
+ if self.additiveChecked:
+ additiveMax = max(map(lambda X : abs(X['additive']), self.qtlresults))
#if INTERCROSS:
# dominanceMax = max(map(lambda X : abs(X.dominance), self.qtlresults[0]))
#else:
# dominanceMax = -1
lrsEdgeWidth = 2
-
+
if zoom == 2:
lrsEdgeWidth = 2 * lrsEdgeWidth
@@ -1931,6 +1998,7 @@ class MarkerRegression(object):
previous_chr = 1
previous_chr_as_int = 0
+ lineWidth = 1
oldStartPosX = 0
startPosX = xLeftOffset
for i, qtlresult in enumerate(self.qtlresults):
@@ -1939,63 +2007,9 @@ class MarkerRegression(object):
thisLRSColor = self.colorCollection[0]
if qtlresult['chr'] != previous_chr and self.selectedChr == -1:
- previous_chr = qtlresult['chr']
- previous_chr_as_int += 1
-
- newStartPosX = (self.ChrLengthDistList[previous_chr_as_int - 1]+self.GraphInterval)*plotXScale
- if newStartPosX != oldStartPosX:
- startPosX += newStartPosX
- oldStartPosX = newStartPosX
-
- #startPosX += (self.ChrLengthDistList[j]+self.GraphInterval)*plotXScale
-
- #for j, _chr in enumerate(self.genotype):
- if self.selectedChr == -1 or qtlresult['chr'] == self.selectedChr:
- #LRSCoordXY = []
- #AdditiveCoordXY = []
- #DominanceCoordXY = []
- #for k, _locus in enumerate(_chr):
- if 1 == 1:
- Xc = startPosX + (qtlresult['Mb']-startMb)*plotXScale
- #if self.plotScale == 'physic':
- #Xc = startPosX + (_locus.Mb-startMb)*plotXScale
- #Xc = startPosX + (qtlresult['Mb']-startMb)*plotXScale
- #else:
- #Xc = startPosX + (_locus.cM-_chr[0].cM)*plotXScale
- #Xc = startPosX + (qtlresult['cM']-qtlresult[0]['cM'])*plotXScale
-
- # updated by NL 06-18-2011:
- # fix the over limit LRS graph issue since genotype trait may give infinite LRS;
- # for any lrs is over than 460(LRS max in this system), it will be reset to 460
- if self.LRS_LOD == "LRS":
- if qtlresult['lrs_value'] > 460 or qtlresult['lrs_value']=='inf':
- Yc = yZero - webqtlConfig.MAXLRS*LRSHeightThresh/LRSMax
- else:
- Yc = yZero - qtlresult['lrs_value']*LRSHeightThresh/LRSMax
- else:
- if qtlresult['lod_score'] > 100 or qtlresult['lod_score']=='inf':
- Yc = yZero - webqtlConfig.MAXLRS*LRSHeightThresh/LRSMax
- else:
- Yc = yZero - qtlresult['lod_score']*LRSHeightThresh/LRSMax
- #if qtlresult['lrs_value'] > 460 or qtlresult['lrs_value']=='inf':
- #if self.qtlresults[j]['lrs_value'] > 460 or self.qtlresults[j]['lrs_value']=='inf':
- # Yc = yZero - webqtlConfig.MAXLRS*LRSHeightThresh/LRSMax
- #else:
- # Yc = yZero - qtlresult['lrs_value']*LRSHeightThresh/LRSMax
+ if self.manhattan_plot != True:
+ canvas.drawPolygon(LRSCoordXY,edgeColor=thisLRSColor,closed=0, edgeWidth=lrsEdgeWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
- LRSCoordXY.append((Xc, Yc))
- #if not self.multipleInterval and self.additiveChecked:
- # if additiveMax == 0.0:
- # additiveMax = 0.000001
- # Yc = yZero - qtlresult[m].additive*AdditiveHeightThresh/additiveMax
- # AdditiveCoordXY.append((Xc, Yc))
- #if not self.multipleInterval and INTERCROSS and self.additiveChecked:
- # Yc = yZero - qtlresult[m].dominance*DominanceHeightThresh/dominanceMax
- # DominanceCoordXY.append((Xc, Yc))
- m += 1
- #canvas.drawPolygon(LRSCoordXY,edgeColor=thisLRSColor,closed=0, edgeWidth=lrsEdgeWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
-
- lineWidth = 1
if not self.multipleInterval and self.additiveChecked:
plusColor = self.ADDITIVE_COLOR_POSITIVE
minusColor = self.ADDITIVE_COLOR_NEGATIVE
@@ -2025,38 +2039,144 @@ class MarkerRegression(object):
canvas.drawLine(Xc0, Yc0, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
else:
canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xc, yZero - (Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
- if not self.multipleInterval and INTERCROSS and self.dominanceChecked:
- plusColor = self.DOMINANCE_COLOR_POSITIVE
- minusColor = self.DOMINANCE_COLOR_NEGATIVE
- for k, aPoint in enumerate(DominanceCoordXY):
- if k > 0:
- Xc0, Yc0 = DominanceCoordXY[k-1]
- Xc, Yc = aPoint
- if (Yc0-yZero)*(Yc-yZero) < 0:
- if Xc == Xc0: #genotype , locus distance is 0
- Xcm = Xc
- else:
- Xcm = (yZero-Yc0)/((Yc-Yc0)/(Xc-Xc0)) +Xc0
- if Yc0 < yZero:
- canvas.drawLine(Xc0, Yc0, Xcm, yZero, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
- canvas.drawLine(Xcm, yZero, Xc, yZero-(Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
- else:
- canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xcm, yZero, color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
- canvas.drawLine(Xcm, yZero, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
- elif (Yc0-yZero)*(Yc-yZero) > 0:
- if Yc < yZero:
- canvas.drawLine(Xc0, Yc0, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
- else:
- canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xc, yZero - (Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
- else:
- minYc = min(Yc-yZero, Yc0-yZero)
- if minYc < 0:
- canvas.drawLine(Xc0, Yc0, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
- else:
- canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xc, yZero - (Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
-
- canvas.drawPolygon(LRSCoordXY,edgeColor=thisLRSColor,closed=0, edgeWidth=lrsEdgeWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ LRSCoordXY = []
+ AdditiveCoordXY = []
+ previous_chr = qtlresult['chr']
+ previous_chr_as_int += 1
+
+ newStartPosX = (self.ChrLengthDistList[previous_chr_as_int - 1]+self.GraphInterval)*plotXScale
+ if newStartPosX != oldStartPosX:
+ startPosX += newStartPosX
+ oldStartPosX = newStartPosX
+
+ #startPosX += (self.ChrLengthDistList[j]+self.GraphInterval)*plotXScale
+
+ #for j, _chr in enumerate(self.genotype):
+ #ZS: This is beause the chromosome value stored in qtlresult['chr'] can be (for example) either X or 20 depending upon the mapping method/scale used
+ if self.plotScale == "physic":
+ this_chr = str(self.ChrList[self.selectedChr][0])
+ else:
+ this_chr = str(self.ChrList[self.selectedChr][1]+1)
+ if self.selectedChr == -1 or str(qtlresult['chr']) == this_chr:
+ #AdditiveCoordXY = []
+ #DominanceCoordXY = []
+ #for k, _locus in enumerate(_chr):
+ Xc = startPosX + (qtlresult['Mb']-startMb)*plotXScale
+ #if self.plotScale == 'physic':
+ #Xc = startPosX + (_locus.Mb-startMb)*plotXScale
+ #Xc = startPosX + (qtlresult['Mb']-startMb)*plotXScale
+ #else:
+ #Xc = startPosX + (_locus.cM-_chr[0].cM)*plotXScale
+ #Xc = startPosX + (qtlresult['cM']-qtlresult[0]['cM'])*plotXScale
+
+ # updated by NL 06-18-2011:
+ # fix the over limit LRS graph issue since genotype trait may give infinite LRS;
+ # for any lrs is over than 460(LRS max in this system), it will be reset to 460
+ if 'lrs_value' in qtlresult:
+ if self.LRS_LOD == "LOD":
+ if qtlresult['lrs_value'] > 460 or qtlresult['lrs_value']=='inf':
+ Yc = yZero - webqtlConfig.MAXLRS*LRSHeightThresh/(LRS_LOD_Max*self.LODFACTOR)
+ else:
+ Yc = yZero - qtlresult['lrs_value']*LRSHeightThresh/(LRS_LOD_Max*self.LODFACTOR)
+ else:
+ if qtlresult['lrs_value'] > 460 or qtlresult['lrs_value']=='inf':
+ Yc = yZero - webqtlConfig.MAXLRS*LRSHeightThresh/LRS_LOD_Max
+ else:
+ Yc = yZero - qtlresult['lrs_value']*LRSHeightThresh/LRS_LOD_Max
+ else:
+ if qtlresult['lod_score'] > 100 or qtlresult['lod_score']=='inf':
+ Yc = yZero - webqtlConfig.MAXLRS*LRSHeightThresh/LRS_LOD_Max
+ else:
+ if self.LRS_LOD == "LRS":
+ Yc = yZero - qtlresult['lod_score']*self.LODFACTOR*LRSHeightThresh/LRS_LOD_Max
+ else:
+ Yc = yZero - qtlresult['lod_score']*LRSHeightThresh/LRS_LOD_Max
+ #if qtlresult['lrs_value'] > 460 or qtlresult['lrs_value']=='inf':
+ #if self.qtlresults[j]['lrs_value'] > 460 or self.qtlresults[j]['lrs_value']=='inf':
+ # Yc = yZero - webqtlConfig.MAXLRS*LRSHeightThresh/LRS_LOD_Max
+ #else:
+ # Yc = yZero - qtlresult['lrs_value']*LRSHeightThresh/LRS_LOD_Max
+
+ if self.manhattan_plot == True:
+ canvas.drawEllipse(Xc-1, Yc-1, Xc+1, Yc+1, fillColor=pid.black)
+ else:
+ LRSCoordXY.append((Xc, Yc))
+
+ if not self.multipleInterval and self.additiveChecked:
+ if additiveMax == 0.0:
+ additiveMax = 0.000001
+ Yc = yZero - qtlresult['additive']*AdditiveHeightThresh/additiveMax
+ AdditiveCoordXY.append((Xc, Yc))
+ # if not self.multipleInterval and INTERCROSS and self.additiveChecked:
+ # Yc = yZero - qtlresult['dominance']*DominanceHeightThresh/dominanceMax
+ # DominanceCoordXY.append((Xc, Yc))
+ m += 1
+ #canvas.drawPolygon(LRSCoordXY,edgeColor=thisLRSColor,closed=0, edgeWidth=lrsEdgeWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+
+ if self.manhattan_plot != True:
+ canvas.drawPolygon(LRSCoordXY,edgeColor=thisLRSColor,closed=0, edgeWidth=lrsEdgeWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+
+ if not self.multipleInterval and self.additiveChecked:
+ plusColor = self.ADDITIVE_COLOR_POSITIVE
+ minusColor = self.ADDITIVE_COLOR_NEGATIVE
+ for k, aPoint in enumerate(AdditiveCoordXY):
+ if k > 0:
+ Xc0, Yc0 = AdditiveCoordXY[k-1]
+ Xc, Yc = aPoint
+ if (Yc0-yZero)*(Yc-yZero) < 0:
+ if Xc == Xc0: #genotype , locus distance is 0
+ Xcm = Xc
+ else:
+ Xcm = (yZero-Yc0)/((Yc-Yc0)/(Xc-Xc0)) +Xc0
+ if Yc0 < yZero:
+ canvas.drawLine(Xc0, Yc0, Xcm, yZero, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ canvas.drawLine(Xcm, yZero, Xc, yZero-(Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ else:
+ canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xcm, yZero, color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ canvas.drawLine(Xcm, yZero, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ elif (Yc0-yZero)*(Yc-yZero) > 0:
+ if Yc < yZero:
+ canvas.drawLine(Xc0, Yc0, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ else:
+ canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xc, yZero - (Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ else:
+ minYc = min(Yc-yZero, Yc0-yZero)
+ if minYc < 0:
+ canvas.drawLine(Xc0, Yc0, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ else:
+ canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xc, yZero - (Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+
+ if not self.multipleInterval and INTERCROSS and self.dominanceChecked:
+ plusColor = self.DOMINANCE_COLOR_POSITIVE
+ minusColor = self.DOMINANCE_COLOR_NEGATIVE
+ for k, aPoint in enumerate(DominanceCoordXY):
+ if k > 0:
+ Xc0, Yc0 = DominanceCoordXY[k-1]
+ Xc, Yc = aPoint
+ if (Yc0-yZero)*(Yc-yZero) < 0:
+ if Xc == Xc0: #genotype , locus distance is 0
+ Xcm = Xc
+ else:
+ Xcm = (yZero-Yc0)/((Yc-Yc0)/(Xc-Xc0)) +Xc0
+ if Yc0 < yZero:
+ canvas.drawLine(Xc0, Yc0, Xcm, yZero, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ canvas.drawLine(Xcm, yZero, Xc, yZero-(Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ else:
+ canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xcm, yZero, color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ canvas.drawLine(Xcm, yZero, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ elif (Yc0-yZero)*(Yc-yZero) > 0:
+ if Yc < yZero:
+ canvas.drawLine(Xc0, Yc0, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ else:
+ canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xc, yZero - (Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ else:
+ minYc = min(Yc-yZero, Yc0-yZero)
+ if minYc < 0:
+ canvas.drawLine(Xc0, Yc0, Xc, Yc, color=plusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+ else:
+ canvas.drawLine(Xc0, yZero - (Yc0-yZero), Xc, yZero - (Yc-yZero), color=minusColor, width=lineWidth, clipX=(xLeftOffset, xLeftOffset + plotWidth))
+
###draw additive scale
if not self.multipleInterval and self.additiveChecked:
@@ -2092,7 +2212,7 @@ class MarkerRegression(object):
if zoom == 2:
fontZoom = 1.5
yTopOffset += 30
-
+
#calculate plot scale
if self.plotScale != 'physic':
self.ChrLengthDistList = self.ChrLengthCMList
@@ -2113,7 +2233,7 @@ class MarkerRegression(object):
canvas.drawRect(startPix, yTopOffset, min(startPix+spacingAmt, xLeftOffset+plotWidth), \
yBottom, edgeColor=theBackColor, fillColor=theBackColor)
- drawRegionDistance = self.ChrLengthDistList[self.selectedChr]
+ drawRegionDistance = self.ChrLengthDistList[self.ChrList[self.selectedChr][1]]
self.ChrLengthDistList = [drawRegionDistance]
if self.plotScale == 'physic':
plotXScale = plotWidth / (endMb-startMb)
@@ -2166,17 +2286,17 @@ class MarkerRegression(object):
if self.multipleInterval:
self.suggestive = 0
- self.significance = 0
+ self.significant = 0
if self.selectedChr > -1:
self.genotype.chromosome = [self.genotype[self.selectedChr]]
else:
#single interval mapping
try:
self.suggestive = float(fd.formdata.getvalue('permSuggestive'))
- self.significance = float(fd.formdata.getvalue('permSignificance'))
+ self.significant = float(fd.formdata.getvalue('permSignificance'))
except:
self.suggestive = None
- self.significance = None
+ self.significant = None
_strains, _vals, _vars = self.traitList[0].exportInformative(weightedRegression)
@@ -2207,21 +2327,21 @@ class MarkerRegression(object):
return "The control marker you selected is not in the genofile."
if weightedRegression:
- self.LRSArray = self.genotype.permutation(strains = _strains, trait = _vals,
+ self.perm_output = self.genotype.permutation(strains = _strains, trait = _vals,
variance = _vars, nperm=self.nperm)
else:
- self.LRSArray = self.genotype.permutation(strains = _strains, trait = _vals,
+ self.perm_output = self.genotype.permutation(strains = _strains, trait = _vals,
nperm=self.nperm)
- if self.significance and self.suggestive:
+ if self.significant and self.suggestive:
pass
else:
if self.nperm < 100:
self.suggestive = 0
- self.significance = 0
+ self.significant = 0
else:
- self.suggestive = self.LRSArray[int(self.nperm*0.37-1)]
- self.significance = self.LRSArray[int(self.nperm*0.95-1)]
+ self.suggestive = self.perm_output[int(self.nperm*0.37-1)]
+ self.significant = self.perm_output[int(self.nperm*0.95-1)]
#calculating bootstrap
#from now on, genotype could only contain a single chromosome
@@ -2392,7 +2512,7 @@ class MarkerRegression(object):
controlsForm.append(controlsTable)
controlsForm.append(HT.Input(name="permSuggestive", value=self.suggestive, type="hidden"))
- controlsForm.append(HT.Input(name="permSignificance", value=self.significance, type="hidden"))
+ controlsForm.append(HT.Input(name="permSignificance", value=self.significant, type="hidden"))
## BEGIN HaplotypeAnalyst #### haplotypeAnalystCheck added below
## END HaplotypeAnalyst
@@ -2453,157 +2573,193 @@ class MarkerRegression(object):
# Permutation Graph
#########################################
myCanvas = pid.PILCanvas(size=(400,300))
- #plotBar(myCanvas,10,10,390,290,LRSArray,XLabel='LRS',YLabel='Frequency',title=' Histogram of Permutation Test',identification=fd.identification)
- Plot.plotBar(myCanvas, self.LRSArray,XLabel='LRS',YLabel='Frequency',title=' Histogram of Permutation Test')
+ if 'lod_score' in self.qtlresults[0] and self.LRS_LOD == "LRS":
+ perm_output = [value*4.16 for value in self.perm_output]
+ elif 'lod_score' not in self.qtlresults[0] and self.LRS_LOD == "LOD":
+ perm_output = [value/4.16 for value in self.perm_output]
+ else:
+ perm_output = self.perm_output
+
+ Plot.plotBar(myCanvas, perm_output, XLabel=self.LRS_LOD, YLabel='Frequency', title=' Histogram of Permutation Test')
filename= webqtlUtil.genRandStr("Reg_")
- myCanvas.save(webqtlConfig.IMGDIR+filename, format='gif')
- img=HT.Image('/image/'+filename+'.gif',border=0,alt='Histogram of Permutation Test')
+ myCanvas.save(GENERATED_IMAGE_DIR+filename, format='gif')
+ return filename
- self.suggestive = self.LRSArray[int(self.nperm*0.37-1)]
- self.significant = self.LRSArray[int(self.nperm*0.95-1)]
- self.highlysignificant = self.LRSArray[int(self.nperm*0.99-1)]
+ # img=HT.Image('/image/'+filename+'.gif',border=0,alt='Histogram of Permutation Test')
- permutationHeading = HT.Paragraph('Histogram of Permutation Test')
- permutationHeading.__setattr__("class","title")
+ # self.suggestive = self.perm_output[int(self.nperm*0.37-1)]
+ # self.significant = self.perm_output[int(self.nperm*0.95-1)]
+ # self.highlysignificant = self.perm_output[int(self.nperm*0.99-1)]
+
+ # permutationHeading = HT.Paragraph('Histogram of Permutation Test')
+ # permutationHeading.__setattr__("class","title")
+
+ # permutation = HT.TableLite()
+ # permutation.append(HT.TR(HT.TD(img)),
+ # HT.TR(HT.TD('')),
+ # HT.TR(HT.TD('Total of %d permutations'%self.nperm)))
+
+ # return permutation
- permutation = HT.TableLite()
- permutation.append(HT.TR(HT.TD(img)),
- HT.TR(HT.TD('')),
- HT.TR(HT.TD('Total of %d permutations'%self.nperm)))
-
- return permutation
-
def permutationTextFile(self):
filename= webqtlUtil.genRandStr("Reg_")
fpText = open('%s.txt' % (webqtlConfig.TMPDIR+filename), 'wb')
fpText.write('Suggestive LRS (p = 0.63) = %3.2f\n'%self.suggestive)
fpText.write('Significant LRS (p = 0.05) = %3.2f\n'%self.significant)
fpText.write('Highly Significant LRS (p = 0.01) = %3.2f\n\n'%self.highlysignificant)
- fpText.write('%s Permutations\n\n' % str(len(self.LRSArray)))
+ fpText.write('%s Permutations\n\n' % str(len(self.perm_output)))
LRSInfo =HT.Paragraph('&nbsp;&nbsp;&nbsp;&nbsp;Suggestive LRS = %3.2f\n'%self.suggestive,
HT.BR(),
'&nbsp;&nbsp;&nbsp;&nbsp;Significant LRS =%3.2f\n'%self.significant,
HT.BR(),
'&nbsp;&nbsp;&nbsp;&nbsp;Highly Significant LRS =%3.2f\n' % self.highlysignificant)
-
- for lrs_value in self.LRSArray:
+
+ for lrs_value in self.perm_output:
fpText.write(str(lrs_value) + "\n")
-
+
textUrl = HT.Href(text = 'Download Permutation Results', url= '/tmp/'+filename+'.txt', target = "_blank", Class='fs12 fwn')
-
+
return textUrl
def geneTable(self, geneCol, refGene=None):
#SNPLink = 0 #Not sure what this is used for
- if self.species == 'mouse' or self.species == 'rat':
+ if self.dataset.group.species == 'mouse' or self.dataset.group.species == 'rat':
+ #gene_tblobj = {}
+ self.gene_table_header = self.getGeneTableHeader(refGene=None)
+ self.gene_table_body = self.getGeneTableBody(geneCol, refGene=None)
+ #gene_tblobj["header"] = self.getGeneTableHeader(refGene=None)
+ #gene_tblobj["body"] = self.getGeneTableBody(geneCol, refGene=None)
- gene_tblobj = {}
- gene_tblobj["header"] = self.getGeneTableHeader(refGene=None)
- gene_tblobj["body"] = self.getGeneTableBody(geneCol, refGene=None)
+ #sortby = self.getSortByValue()
- sortby = self.getSortByValue()
+ #filename= webqtlUtil.genRandStr("Mapping_")
- filename= webqtlUtil.genRandStr("Mapping_")
-
- objfile = open('%s.obj' % (webqtlConfig.TMPDIR+filename), 'wb')
- cPickle.dump(gene_tblobj, objfile)
- objfile.close()
-
- gene_table = webqtlUtil.genTableObj(tblobj=gene_tblobj, file=filename, sortby=sortby, tableID="sortable", addIndex="0")
+ #objfile = open('%s.obj' % (webqtlConfig.TMPDIR+filename), 'wb')
+ #cPickle.dump(gene_tblobj, objfile)
+ #objfile.close()
+ #gene_table = webqtlUtil.genTableObj(tblobj=gene_tblobj, file=filename, sortby=sortby, tableID="sortable", addIndex="0")
else:
- gene_table = ""
+ self.gene_table_header = None
+ self.gene_table_body = None
+ #gene_table = ""
- return gene_table
-
- def getLiteratureCorrelation(cursor,geneId1=None,geneId2=None):
- if not geneId1 or not geneId2:
- return None
- if geneId1 == geneId2:
- return 1.0
- geneId1 = str(geneId1)
- geneId2 = str(geneId2)
- lCorr = None
- try:
- query = 'SELECT Value FROM LCorrRamin3 WHERE GeneId1 = %s and GeneId2 = %s'
- for x,y in [(geneId1,geneId2),(geneId2,geneId1)]:
- cursor.execute(query,(x,y))
- lCorr = cursor.fetchone()
- if lCorr:
- lCorr = lCorr[0]
- break
- except: raise #lCorr = None
- return lCorr
+ #return gene_table
def getGeneTableHeader(self, refGene=None):
gene_tblobj_header = []
+
+ gene_table_header_list = []
col_class = "fs14 fwb ffl b1 cw cbrb"
- if self.species == "mouse":
+ if self.dataset.group.species == "mouse":
if refGene:
- gene_tblobj_header = [[THCell(HT.TD('Index', HT.BR(), HT.BR(), align='left', width=50, Class=col_class), text="index", idx=0),
- THCell(HT.TD('Symbol', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="symbol", idx=1),
- THCell(HT.TD('Mb Start',HT.BR(),'(mm9)', align='left', width=100, Class=col_class), text="mb_start_mm9", idx=2),
- THCell(HT.TD('Length (Kb)', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="length", idx=3),
- THCell(HT.TD('SNP',HT.BR(),'Count', align='left', width=47, Class=col_class), text="snp_count", idx=4),
- THCell(HT.TD('SNP',HT.BR(),'Density', align='left', width=78, Class=col_class), text="snp_density", idx=5),
- THCell(HT.TD('Avg',HT.BR(),'Expr', HT.BR(), HT.BR(), align='left', width=44, Class=col_class), sort=0, idx=6),
- THCell(HT.TD('Human',HT.BR(),'Chr', align='left', width=60, Class=col_class), text="human_chr", idx=7),
- THCell(HT.TD('Mb Start',HT.BR(),'(hg19)', align='left', width=100, Class=col_class), text="mb_start_hg19", idx=8),
- THCell(HT.TD('Literature',HT.BR(),'Correlation', align='left', width=100, Class=col_class), text="lit_corr", idx=9),
- THCell(HT.TD('Gene Description', HT.BR(), HT.BR(), align='left', width=290, Class=col_class), text="description", idx=10),
- THCell(HT.TD('PolymiRTS',HT.BR(),'Database', HT.BR(), HT.Href(url='http://compbio.uthsc.edu/miRSNP/', text='>>', target="_blank", Class="normalsize"),
- align='left', width=100, Class=col_class), sort=0, idx=11),
- THCell(HT.TD('Gene Weaver', HT.BR(), 'Info Content', HT.BR(), HT.Href(url='http://geneweaver.org/', text='>>', target="_blank", Class="normalsize"),
- align='left', width=110, Class=col_class), sort=0, idx=12),
- ]]
+ gene_table_header_list = ["Index",
+ "Symbol",
+ "Mb Start",
+ "Length (Kb)",
+ "SNP Count",
+ "SNP Density",
+ "Avg Expr",
+ "Human Chr",
+ "Mb Start (hg19)",
+ "Literature Correlation",
+ "Gene Description",
+ "PolymiRTS Database" + HT.Href(url='http://compbio.uthsc.edu/miRSNP/', text='>>', target="_blank").__str__(),
+ "Gene Weaver Info Content" + HT.Href(url='http://geneweaver.org/', text='>>', target="_blank").__str__()]
+
+ # gene_tblobj_header = [[THCell(HT.TD('Index', HT.BR(), HT.BR(), align='left', width=50, Class=col_class), text="index", idx=0),
+ # THCell(HT.TD('Symbol', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="symbol", idx=1),
+ # THCell(HT.TD('Mb Start',HT.BR(),'(mm9)', align='left', width=100, Class=col_class), text="mb_start_mm9", idx=2),
+ # THCell(HT.TD('Length (Kb)', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="length", idx=3),
+ # THCell(HT.TD('SNP',HT.BR(),'Count', align='left', width=47, Class=col_class), text="snp_count", idx=4),
+ # THCell(HT.TD('SNP',HT.BR(),'Density', align='left', width=78, Class=col_class), text="snp_density", idx=5),
+ # THCell(HT.TD('Avg',HT.BR(),'Expr', HT.BR(), HT.BR(), align='left', width=44, Class=col_class), sort=0, idx=6),
+ # THCell(HT.TD('Human',HT.BR(),'Chr', align='left', width=60, Class=col_class), text="human_chr", idx=7),
+ # THCell(HT.TD('Mb Start',HT.BR(),'(hg19)', align='left', width=100, Class=col_class), text="mb_start_hg19", idx=8),
+ # THCell(HT.TD('Literature',HT.BR(),'Correlation', align='left', width=100, Class=col_class), text="lit_corr", idx=9),
+ # THCell(HT.TD('Gene Description', HT.BR(), HT.BR(), align='left', width=290, Class=col_class), text="description", idx=10),
+ # THCell(HT.TD('PolymiRTS',HT.BR(),'Database', HT.BR(), HT.Href(url='http://compbio.uthsc.edu/miRSNP/', text='>>', target="_blank", Class="normalsize"),
+ # align='left', width=100, Class=col_class), sort=0, idx=11),
+ # THCell(HT.TD('Gene Weaver', HT.BR(), 'Info Content', HT.BR(), HT.Href(url='http://geneweaver.org/', text='>>', target="_blank", Class="normalsize"),
+ # align='left', width=110, Class=col_class), sort=0, idx=12),
+ # ]]
else:
- gene_tblobj_header = [[THCell(HT.TD('Index', HT.BR(), HT.BR(), align='left', width=50, Class=col_class), text="index", idx=0),
- THCell(HT.TD('Symbol', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="symbol", idx=1),
- THCell(HT.TD('Mb Start',HT.BR(),'(mm9)', align='left', width=100, Class=col_class), text="mb_start_mm9", idx=2),
- THCell(HT.TD('Length (Kb)', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="length", idx=3),
- THCell(HT.TD('SNP',HT.BR(),'Count', align='left', width=47, Class=col_class), text="snp_count", idx=4),
- THCell(HT.TD('SNP',HT.BR(),'Density', align='left', width=78, Class=col_class), text="snp_density", idx=5),
- THCell(HT.TD('Avg',HT.BR(),'Expr', HT.BR(), HT.BR(), align='left', width=44, Class=col_class), sort=0, idx=6),
- THCell(HT.TD('Human',HT.BR(),'Chr', align='left', width=60, Class=col_class), text="human_chr", idx=7),
- THCell(HT.TD('Mb Start',HT.BR(),'(hg19)', align='left', width=100, Class=col_class), text="mb_start_hg19", idx=8),
- THCell(HT.TD('Gene Description', HT.BR(), HT.BR(), align='left', width=290, Class=col_class), text="description", idx=9),
- THCell(HT.TD('PolymiRTS',HT.BR(),'Database', HT.BR(), HT.Href(url='http://compbio.uthsc.edu/miRSNP/', text='>>', target="_blank", Class="normalsize"),
- align='left', width=100, Class=col_class), sort=0, idx=10),
- THCell(HT.TD('Gene Weaver', HT.BR(), 'Info Content', HT.BR(), HT.Href(url='http://geneweaver.org/', text='>>', target="_blank", Class="normalsize"),
- align='left', width=110, Class=col_class), sort=0, idx=11),
- ]]
-
- elif self.species == "rat":
-
- gene_tblobj_header = [[THCell(HT.TD('Index', HT.BR(), HT.BR(), align='left', width=50, Class=col_class), text="index", idx=0),
- THCell(HT.TD('Symbol', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="symbol", idx=1),
- THCell(HT.TD('Mb Start',HT.BR(),'(rn3)', align='left', width=100, Class=col_class), text="mb_start_rn3", idx=2),
- THCell(HT.TD('Length (Kb)', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="length", idx=3),
- THCell(HT.TD('Avg',HT.BR(),'Expr', HT.BR(), HT.BR(), align='left', width=44, Class=col_class), sort=0, idx=4),
- THCell(HT.TD('Mouse',HT.BR(),'Chr', align='left', width=60, Class=col_class), text="mouse_chr", idx=5),
- THCell(HT.TD('Mb Start',HT.BR(),'(mm9)', align='left', width=100, Class=col_class), text="mb_start_mm9", idx=6),
- THCell(HT.TD('Human',HT.BR(),'Chr', align='left', width=60, Class=col_class), text="human_chr", idx=7),
- THCell(HT.TD('Mb Start',HT.BR(),'(hg19)', align='left', width=100, Class=col_class), text="mb_start_hg19", idx=8),
- THCell(HT.TD('Gene Description', HT.BR(), HT.BR(), align='left', Class=col_class), text="description", idx=9)]]
+ gene_table_header_list = ["",
+ "Index",
+ "Symbol",
+ "Mb Start",
+ "Length (Kb)",
+ "SNP Count",
+ "SNP Density",
+ "Avg Expr",
+ "Human Chr",
+ "Mb Start (hg19)",
+ "Gene Description",
+ "PolymiRTS Database" + HT.Href(url='http://compbio.uthsc.edu/miRSNP/', text='>>', target="_blank").__str__(),
+ "Gene Weaver Info Content" + HT.Href(url='http://geneweaver.org/', text='>>', target="_blank").__str__()]
+
+ # gene_tblobj_header = [[THCell(HT.TD('Index', HT.BR(), HT.BR(), align='left', width=50, Class=col_class), text="index", idx=0),
+ # THCell(HT.TD('Symbol', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="symbol", idx=1),
+ # THCell(HT.TD('Mb Start',HT.BR(),'(mm9)', align='left', width=100, Class=col_class), text="mb_start_mm9", idx=2),
+ # THCell(HT.TD('Length (Kb)', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="length", idx=3),
+ # THCell(HT.TD('SNP',HT.BR(),'Count', align='left', width=47, Class=col_class), text="snp_count", idx=4),
+ # THCell(HT.TD('SNP',HT.BR(),'Density', align='left', width=78, Class=col_class), text="snp_density", idx=5),
+ # THCell(HT.TD('Avg',HT.BR(),'Expr', HT.BR(), HT.BR(), align='left', width=44, Class=col_class), sort=0, idx=6),
+ # THCell(HT.TD('Human',HT.BR(),'Chr', align='left', width=60, Class=col_class), text="human_chr", idx=7),
+ # THCell(HT.TD('Mb Start',HT.BR(),'(hg19)', align='left', width=100, Class=col_class), text="mb_start_hg19", idx=8),
+ # THCell(HT.TD('Gene Description', HT.BR(), HT.BR(), align='left', width=290, Class=col_class), text="description", idx=9),
+ # THCell(HT.TD('PolymiRTS',HT.BR(),'Database', HT.BR(), HT.Href(url='http://compbio.uthsc.edu/miRSNP/', text='>>', target="_blank", Class="normalsize"),
+ # align='left', width=100, Class=col_class), sort=0, idx=10),
+ # THCell(HT.TD('Gene Weaver', HT.BR(), 'Info Content', HT.BR(), HT.Href(url='http://geneweaver.org/', text='>>', target="_blank", Class="normalsize"),
+ # align='left', width=110, Class=col_class), sort=0, idx=11),
+ # ]]
+
+ elif self.dataset.group.species == "rat":
+
+ gene_table_header_list = ["",
+ "Index",
+ "Symbol",
+ "Mb Start",
+ "Length (Kb)",
+ "Avg Expr",
+ "Mouse Chr",
+ "Mb Start (mm9)",
+ "Human Chr",
+ "Mb Start (hg19)",
+ "Gene Description"]
+
+ # gene_tblobj_header = [[THCell(HT.TD('Index', HT.BR(), HT.BR(), align='left', width=50, Class=col_class), text="index", idx=0),
+ # THCell(HT.TD('Symbol', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="symbol", idx=1),
+ # THCell(HT.TD('Mb Start',HT.BR(),'(rn3)', align='left', width=100, Class=col_class), text="mb_start_rn3", idx=2),
+ # THCell(HT.TD('Length (Kb)', HT.BR(), HT.BR(), align='left', width=100, Class=col_class), text="length", idx=3),
+ # THCell(HT.TD('Avg',HT.BR(),'Expr', HT.BR(), HT.BR(), align='left', width=44, Class=col_class), sort=0, idx=4),
+ # THCell(HT.TD('Mouse',HT.BR(),'Chr', align='left', width=60, Class=col_class), text="mouse_chr", idx=5),
+ # THCell(HT.TD('Mb Start',HT.BR(),'(mm9)', align='left', width=100, Class=col_class), text="mb_start_mm9", idx=6),
+ # THCell(HT.TD('Human',HT.BR(),'Chr', align='left', width=60, Class=col_class), text="human_chr", idx=7),
+ # THCell(HT.TD('Mb Start',HT.BR(),'(hg19)', align='left', width=100, Class=col_class), text="mb_start_hg19", idx=8),
+ # THCell(HT.TD('Gene Description', HT.BR(), HT.BR(), align='left', Class=col_class), text="description", idx=9)]]
else:
pass
- return gene_tblobj_header
+ return gene_table_header_list
+ #return gene_tblobj_header
def getGeneTableBody(self, geneCol, refGene=None):
tblobj_body = [] #contains table rows
className = "fs13 b1 c222"
+
+ gene_table_body = []
tableIterationsCnt = 0
- if self.species == "mouse":
+ if self.dataset.group.species == "mouse":
# polymiRTS
# http://lily.uthsc.edu:8080/20090422_UTHSC_cuiyan/PolymiRTS_CLS?chrom=2&chrom_from=115&chrom_to=125
@@ -2642,8 +2798,8 @@ class MarkerRegression(object):
allProbeString = '%s?cmd=sch&gene=%s&alias=1' % (os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), theGO["GeneSymbol"])
if theGO["snpCount"]:
- snpString = HT.Href(url="%s&chr=%s&start=%s&end=%s&geneName=%s&s1=%d&s2=%d" % (os.path.join(webqtlConfig.CGIDIR, 'main.py?FormID=snpBrowser'),
- theGO["Chromosome"], theGO["TxStart"], theGO["TxEnd"], theGO["GeneSymbol"], self.diffCol[0], self.diffCol[1]),
+ snpString = HT.Href(url="http://genenetwork.org/webqtl/main.py?FormID=snpBrowser&chr=%s&start=%s&end=%s&geneName=%s&s1=%d&s2=%d" % (theGO["Chromosome"],
+ theGO["TxStart"], theGO["TxEnd"], theGO["GeneSymbol"], self.diffCol[0], self.diffCol[1]),
text=theGO["snpCount"], target="_blank", Class="normalsize")
else:
snpString = 0
@@ -2680,7 +2836,7 @@ class MarkerRegression(object):
geneDescription = theGO["GeneDescription"]
if len(geneDescription) > 26:
geneDescription = geneDescription[:26]+"..."
- probeSetSearch = HT.Href(allProbeString, HT.Image("/images/webqtl_search.gif", border=0), target="_blank")
+ probeSetSearch = HT.Href(allProbeString, ">>", target="_blank")
if theGO["snpDensity"] < 0.000001:
snpDensityStr = "0"
@@ -2707,37 +2863,69 @@ class MarkerRegression(object):
literatureCorrelationString = str(self.getLiteratureCorrelation(self.cursor,refGene,theGO['GeneID']) or "N/A")
- this_row.append(TDCell(HT.TD(tableIterationsCnt, selectCheck, width=30, align='right', Class=className), tableIterationsCnt, tableIterationsCnt))
- this_row.append(TDCell(HT.TD(HT.Href(geneIdString, theGO["GeneSymbol"], target="_blank"), "&nbsp;", probeSetSearch, align='right', Class=className), theGO["GeneSymbol"], theGO["GeneSymbol"]))
- this_row.append(TDCell(HT.TD(HT.Href(mouseStartString, "%0.6f" % txStart, target="_blank"), align='right', Class=className), str(mouseStartValue), mouseStartValue))
- this_row.append(TDCell(HT.TD(HT.Href("javascript:centerIntervalMapOnRange2('%s', " % theGO["Chromosome"]+str(txStart-tenPercentLength) + ", " + str(txEnd+tenPercentLength) + ", document.changeViewForm)", "%0.3f" % geneLength), align='right', Class=className), "%0.3f" % geneLength, geneLength))
- this_row.append(TDCell(HT.TD(snpString, align='right', Class=className), str(theGO["snpCount"]), theGO["snpCount"]))
- this_row.append(TDCell(HT.TD(snpDensityStr, align='right', Class=className), snpDensityStr, theGO["snpDensity"]))
- this_row.append(TDCell(HT.TD(avgExpr, align='right', Class=className), "--", "--"))
- this_row.append(TDCell(HT.TD(humanChr, align='right', Class=className), humanChr, humanChrSort))
- this_row.append(TDCell(HT.TD(HT.Href(humanStartString, humanStartDisplay, target="_blank"), align='right', Class=className), humanStartDisplay, humanStartValue))
- this_row.append(TDCell(HT.TD(literatureCorrelationString, align='right', Class=className), literatureCorrelationString, literatureCorrelation))
- this_row.append(TDCell(HT.TD(geneDescription, align='right', Class=className), geneDescription, geneDescription))
- this_row.append(TDCell(HT.TD(polymiRTS, align='right', Class=className), "", ""))
- this_row.append(TDCell(HT.TD("", align='right', Class=className), "", ""))
+ this_row = [selectCheck.__str__(),
+ str(tableIterationsCnt),
+ HT.Href(geneIdString, theGO["GeneSymbol"], target="_blank").__str__() + "&nbsp;" + probeSetSearch.__str__(),
+ HT.Href(mouseStartString, "%0.6f" % txStart, target="_blank").__str__(),
+ HT.Href("javascript:rangeView('%s', %f, %f)" % (str(int(theGO["Chromosome"])-1), txStart-tenPercentLength, txEnd+tenPercentLength), "%0.3f" % geneLength).__str__(),
+ snpString,
+ snpDensityStr,
+ avgExpr,
+ humanChr,
+ HT.Href(humanStartString, humanStartDisplay, target="_blank").__str__(),
+ literatureCorrelationString,
+ geneDescription,
+ polymiRTS,
+ ""]
+
+ # this_row.append(TDCell(HT.TD(tableIterationsCnt, selectCheck, width=30, align='right', Class=className), tableIterationsCnt, tableIterationsCnt))
+ # this_row.append(TDCell(HT.TD(HT.Href(geneIdString, theGO["GeneSymbol"], target="_blank"), "&nbsp;", probeSetSearch, align='right', Class=className), theGO["GeneSymbol"], theGO["GeneSymbol"]))
+ # this_row.append(TDCell(HT.TD(HT.Href(mouseStartString, "%0.6f" % txStart, target="_blank"), align='right', Class=className), str(mouseStartValue), mouseStartValue))
+ # this_row.append(TDCell(HT.TD(HT.Href("javascript:centerIntervalMapOnRange2('%s', " % theGO["Chromosome"]+str(txStart-tenPercentLength) + ", " + str(txEnd+tenPercentLength) + ", document.changeViewForm)", "%0.3f" % geneLength), align='right', Class=className), "%0.3f" % geneLength, geneLength))
+ # this_row.append(TDCell(HT.TD(snpString, align='right', Class=className), str(theGO["snpCount"]), theGO["snpCount"]))
+ # this_row.append(TDCell(HT.TD(snpDensityStr, align='right', Class=className), snpDensityStr, theGO["snpDensity"]))
+ # this_row.append(TDCell(HT.TD(avgExpr, align='right', Class=className), "--", "--"))
+ # this_row.append(TDCell(HT.TD(humanChr, align='right', Class=className), humanChr, humanChrSort))
+ # this_row.append(TDCell(HT.TD(HT.Href(humanStartString, humanStartDisplay, target="_blank"), align='right', Class=className), humanStartDisplay, humanStartValue))
+ # this_row.append(TDCell(HT.TD(literatureCorrelationString, align='right', Class=className), literatureCorrelationString, literatureCorrelation))
+ # this_row.append(TDCell(HT.TD(geneDescription, align='right', Class=className), geneDescription, geneDescription))
+ # this_row.append(TDCell(HT.TD(polymiRTS, align='right', Class=className), "", ""))
+ # this_row.append(TDCell(HT.TD("", align='right', Class=className), "", ""))
else:
- this_row.append(TDCell(HT.TD(tableIterationsCnt, selectCheck, width=30, align='right', Class=className), tableIterationsCnt, tableIterationsCnt))
- this_row.append(TDCell(HT.TD(HT.Href(geneIdString, theGO["GeneSymbol"], target="_blank"), "&nbsp;", probeSetSearch, align='right', Class=className), theGO["GeneSymbol"], theGO["GeneSymbol"]))
- this_row.append(TDCell(HT.TD(HT.Href(mouseStartString, "%0.6f" % txStart, target="_blank"), align='right', Class=className), str(mouseStartValue), mouseStartValue))
- this_row.append(TDCell(HT.TD(HT.Href("javascript:centerIntervalMapOnRange2('%s', " % theGO["Chromosome"]+str(txStart-tenPercentLength) + ", " + str(txEnd+tenPercentLength) + ", document.changeViewForm)", "%0.3f" % geneLength), align='right', Class=className), "%0.3f" % geneLength, geneLength))
- this_row.append(TDCell(HT.TD(snpString, align='right', Class=className), str(theGO["snpCount"]), theGO["snpCount"]))
- this_row.append(TDCell(HT.TD(snpDensityStr, align='right', Class=className), snpDensityStr, theGO["snpDensity"]))
- this_row.append(TDCell(HT.TD(avgExpr, align='right', Class=className), "--", "--"))
- this_row.append(TDCell(HT.TD(humanChr, align='right', Class=className), humanChr, humanChrSort))
- this_row.append(TDCell(HT.TD(HT.Href(humanStartString, humanStartDisplay, target="_blank"), align='right', Class=className), humanStartDisplay, humanStartValue))
- this_row.append(TDCell(HT.TD(geneDescription, align='right', Class=className), geneDescription, geneDescription))
- this_row.append(TDCell(HT.TD(polymiRTS, align='right', Class=className), "", ""))
- this_row.append(TDCell(HT.TD("", align='right', Class=className), "", ""))
-
- tblobj_body.append(this_row)
-
- elif self.species == 'rat':
+
+ this_row = [selectCheck.__str__(),
+ str(tableIterationsCnt),
+ HT.Href(geneIdString, theGO["GeneSymbol"], target="_blank").__str__() + "&nbsp;" + probeSetSearch.__str__(),
+ HT.Href(mouseStartString, "%0.6f" % txStart, target="_blank").__str__(),
+ HT.Href("javascript:rangeView('%s', %f, %f)" % (str(int(theGO["Chromosome"])-1), txStart-tenPercentLength, txEnd+tenPercentLength), "%0.3f" % geneLength).__str__(),
+ snpString,
+ snpDensityStr,
+ avgExpr,
+ humanChr,
+ HT.Href(humanStartString, humanStartDisplay, target="_blank").__str__(),
+ geneDescription,
+ polymiRTS,
+ ""]
+
+
+ # this_row.append(TDCell(HT.TD(tableIterationsCnt, selectCheck, width=30, align='right', Class=className), tableIterationsCnt, tableIterationsCnt))
+ # this_row.append(TDCell(HT.TD(HT.Href(geneIdString, theGO["GeneSymbol"], target="_blank"), "&nbsp;", probeSetSearch, align='right', Class=className), theGO["GeneSymbol"], theGO["GeneSymbol"]))
+ # this_row.append(TDCell(HT.TD(HT.Href(mouseStartString, "%0.6f" % txStart, target="_blank"), align='right', Class=className), str(mouseStartValue), mouseStartValue))
+ # this_row.append(TDCell(HT.TD(HT.Href("javascript:centerIntervalMapOnRange2('%s', " % theGO["Chromosome"]+str(txStart-tenPercentLength) + ", " + str(txEnd+tenPercentLength) + ", document.changeViewForm)", "%0.3f" % geneLength), align='right', Class=className), "%0.3f" % geneLength, geneLength))
+ # this_row.append(TDCell(HT.TD(snpString, align='right', Class=className), str(theGO["snpCount"]), theGO["snpCount"]))
+ # this_row.append(TDCell(HT.TD(snpDensityStr, align='right', Class=className), snpDensityStr, theGO["snpDensity"]))
+ # this_row.append(TDCell(HT.TD(avgExpr, align='right', Class=className), "--", "--"))
+ # this_row.append(TDCell(HT.TD(humanChr, align='right', Class=className), humanChr, humanChrSort))
+ # this_row.append(TDCell(HT.TD(HT.Href(humanStartString, humanStartDisplay, target="_blank"), align='right', Class=className), humanStartDisplay, humanStartValue))
+ # this_row.append(TDCell(HT.TD(geneDescription, align='right', Class=className), geneDescription, geneDescription))
+ # this_row.append(TDCell(HT.TD(polymiRTS, align='right', Class=className), "", ""))
+ # this_row.append(TDCell(HT.TD("", align='right', Class=className), "", ""))
+
+ gene_table_body.append(this_row)
+ #tblobj_body.append(this_row)
+
+ elif self.dataset.group.species == 'rat':
for gIndex, theGO in enumerate(geneCol):
@@ -2752,7 +2940,8 @@ class MarkerRegression(object):
geneSymbolNCBI = theGO["GeneSymbol"]
geneLength = (float(theGO["TxEnd"]) - float(theGO["TxStart"]))
- geneLengthURL = "javascript:centerIntervalMapOnRange2('%s', %f, %f, document.changeViewForm)" % (theGO["Chromosome"], float(theGO["TxStart"])-(geneLength*0.1), float(theGO["TxEnd"])+(geneLength*0.1))
+ #geneLengthURL = "javascript:centerIntervalMapOnRange2('%s', %f, %f, document.changeViewForm)" % (theGO["Chromosome"], float(theGO["TxStart"])-(geneLength*0.1), float(theGO["TxEnd"])+(geneLength*0.1))
+ geneLengthURL = "javascript:rangeView('%s', %f, %f)" % (theGO["Chromosome"], float(theGO["TxStart"])-(geneLength*0.1), float(theGO["TxEnd"])+(geneLength*0.1))
avgExprVal = []
if avgExprVal != "" and avgExprVal:
@@ -2784,35 +2973,60 @@ class MarkerRegression(object):
if geneDesc == "---":
geneDesc = ""
- """
- if len(geneDesc) > 40:
- geneDesc = gene0So apparently Angola prison (which used to be a slave plantation) has a rodeo that they invite the general public to.
-The prisoners are not trained before hand
-But its cool because its completely voluntary.
-And by voluntary, according to HFG when I talked to him, they have a choice between doing it or door number two and "door number 2 is... rather worse than volunteering"Desc[:37] + "..."
- """
-
- this_row.append(TDCell(HT.TD(gIndex + 1, selectCheck, align='left', Class=className), str(gIndex+1), gIndex+1))
- this_row.append(TDCell(HT.TD(webqtlSearch, geneSymbolNCBI, align='left', Class=className), theGO["GeneSymbol"], theGO["GeneSymbol"]))
- this_row.append(TDCell(HT.TD(theGO["TxStart"], align='left', Class=className), theGO["TxStart"], theGO["TxStart"]))
- this_row.append(TDCell(HT.TD(HT.Href(geneLengthURL, "%0.3f" % (geneLength*1000.0)), align='left', Class=className), "%0.3f" % (geneLength*1000.0), (geneLength*1000.0)))
- this_row.append(TDCell(HT.TD(avgExprVal, align='left', Class=className), "", ""))
- this_row.append(TDCell(HT.TD(mouseChr, align='left', Class=className), mouseChr, mouseChr))
- this_row.append(TDCell(HT.TD(mouseTxStart, align='left', Class=className), mouseTxStart, mouseTxStart))
- this_row.append(TDCell(HT.TD(humanChr, align='left', Class=className), humanChr, humanChrSort))
- this_row.append(TDCell(HT.TD(humanTxStart, align='left', Class=className), humanTxStart, humanTxStart))
- this_row.append(TDCell(HT.TD(geneDesc, align='left', Class=className), geneDesc, geneDesc))
-
- tblobj_body.append(this_row)
+ this_row = [selectCheck.__str__(),
+ str(gIndex+1),
+ webqtlSearch.__str__() + geneSymbolNCBI,
+ theGO["TxStart"],
+ HT.Href(geneLengthURL, "%0.3f" % (geneLength*1000.0)).__str__(),
+ avgExprVal,
+ mouseChr,
+ mouseTxStart,
+ humanChr,
+ humanTxStart,
+ geneDesc]
+
+
+ #this_row.append(TDCell(HT.TD(gIndex + 1, selectCheck, align='left', Class=className), str(gIndex+1), gIndex+1))
+ #this_row.append(TDCell(HT.TD(webqtlSearch, geneSymbolNCBI, align='left', Class=className), theGO["GeneSymbol"], theGO["GeneSymbol"]))
+ #this_row.append(TDCell(HT.TD(theGO["TxStart"], align='left', Class=className), theGO["TxStart"], theGO["TxStart"]))
+ #this_row.append(TDCell(HT.TD(HT.Href(geneLengthURL, "%0.3f" % (geneLength*1000.0)), align='left', Class=className), "%0.3f" % (geneLength*1000.0), (geneLength*1000.0)))
+ #this_row.append(TDCell(HT.TD(avgExprVal, align='left', Class=className), "", ""))
+ #this_row.append(TDCell(HT.TD(mouseChr, align='left', Class=className), mouseChr, mouseChr))
+ #this_row.append(TDCell(HT.TD(mouseTxStart, align='left', Class=className), mouseTxStart, mouseTxStart))
+ #this_row.append(TDCell(HT.TD(humanChr, align='left', Class=className), humanChr, humanChrSort))
+ #this_row.append(TDCell(HT.TD(humanTxStart, align='left', Class=className), humanTxStart, humanTxStart))
+ #this_row.append(TDCell(HT.TD(geneDesc, align='left', Class=className), geneDesc, geneDesc))
+
+ gene_table_body.append(this_row)
+ #tblobj_body.append(this_row)
else:
pass
- return tblobj_body
-
+ return gene_table_body
+ #return tblobj_body
+
+ def getLiteratureCorrelation(cursor,geneId1=None,geneId2=None):
+ if not geneId1 or not geneId2:
+ return None
+ if geneId1 == geneId2:
+ return 1.0
+ geneId1 = str(geneId1)
+ geneId2 = str(geneId2)
+ lCorr = None
+ try:
+ query = 'SELECT Value FROM LCorrRamin3 WHERE GeneId1 = %s and GeneId2 = %s'
+ for x,y in [(geneId1,geneId2),(geneId2,geneId1)]:
+ cursor.execute(query,(x,y))
+ lCorr = cursor.fetchone()
+ if lCorr:
+ lCorr = lCorr[0]
+ break
+ except: raise #lCorr = None
+ return lCorr
def getSortByValue(self):
sortby = ("", "")
- return sortby \ No newline at end of file
+ return sortby
diff --git a/wqflask/wqflask/model.py b/wqflask/wqflask/model.py
index 5ea32e1f..5ea32e1f 100755..100644
--- a/wqflask/wqflask/model.py
+++ b/wqflask/wqflask/model.py
diff --git a/wqflask/wqflask/search_results.py b/wqflask/wqflask/search_results.py
index fb03f027..8a0485b3 100755..100644
--- a/wqflask/wqflask/search_results.py
+++ b/wqflask/wqflask/search_results.py
@@ -24,9 +24,8 @@ from flask import Flask, g
from MySQLdb import escape_string as escape
# Instead of importing HT we're going to build a class below until we can eliminate it
-from htmlgen import HTMLgen2 as HT
+# from htmlgen import HTMLgen2 as HT
-from base import webqtlConfig
from utility.benchmark import Bench
from base.data_set import create_dataset
from base.trait import GeneralTrait
@@ -64,40 +63,29 @@ class SearchResultPage(object):
# self.dataset_group_ids = map(lambda x: x[2], results)
#else:
- self.quick = False
-
self.uc_id = uuid.uuid4()
print("uc_id:", self.uc_id)
- if 'q' in kw:
- self.results = {}
- self.quick = True
- self.search_terms = kw['q']
- print("self.search_terms is: ", self.search_terms)
- self.trait_type = kw['trait_type']
- self.quick_search()
+ print("kw is:", kw)
+ if kw['search_terms_or']:
+ self.and_or = "or"
+ self.search_terms = kw['search_terms_or']
else:
- print("kw is:", kw)
- if kw['search_terms_or']:
- self.and_or = "or"
- self.search_terms = kw['search_terms_or']
- else:
- self.and_or = "and"
- self.search_terms = kw['search_terms_and']
- self.search_term_exists = True
- self.results = []
- if kw['type'] == "Phenotypes":
- dataset_type = "Publish"
- elif kw['type'] == "Genotypes":
- dataset_type = "Geno"
- else:
- dataset_type = "ProbeSet"
- self.dataset = create_dataset(kw['dataset'], dataset_type)
- print("KEYWORD:", self.search_terms)
- self.search()
- if self.search_term_exists:
- self.gen_search_result()
-
+ self.and_or = "and"
+ self.search_terms = kw['search_terms_and']
+ self.search_term_exists = True
+ self.results = []
+ if kw['type'] == "Phenotypes":
+ dataset_type = "Publish"
+ elif kw['type'] == "Genotypes":
+ dataset_type = "Geno"
+ else:
+ dataset_type = "ProbeSet"
+ self.dataset = create_dataset(kw['dataset'], dataset_type)
+ print("KEYWORD:", self.search_terms)
+ self.search()
+ if self.search_term_exists:
+ self.gen_search_result()
def gen_search_result(self):
@@ -119,62 +107,12 @@ class SearchResultPage(object):
#### Excel file needs to be generated ####
- print("foo locals are:", locals())
+ #print("foo locals are:", locals())
trait_id = result[0]
- this_trait = GeneralTrait(dataset=self.dataset, name=trait_id, get_qtl_info=True)
+ this_trait = GeneralTrait(dataset=self.dataset, name=trait_id, get_qtl_info=True, get_sample_info=False)
self.trait_list.append(this_trait)
self.dataset.get_trait_info(self.trait_list, species)
-
- def quick_search(self):
- #search_terms = ""
- #for term in self.search_terms.split():
- # search_terms += '+{} '.format(term)
-
- search_terms = ' '.join('+{}'.format(escape(term)) for term in self.search_terms.split())
- print("search_terms are:", search_terms)
-
- query = """ SELECT table_name, the_key, result_fields
- FROM QuickSearch
- WHERE MATCH (terms)
- AGAINST ('{}' IN BOOLEAN MODE) """.format(search_terms)
-
- with Bench("Doing QuickSearch Query: "):
- dbresults = g.db.execute(query, no_parameters=True).fetchall()
- #print("results: ", pf(results))
-
- self.results = collections.defaultdict(list)
-
- type_dict = {'PublishXRef': 'phenotype',
- 'ProbeSetXRef': 'mrna_assay',
- 'GenoXRef': 'genotype'}
-
- self.species_groups = {}
-
- for dbresult in dbresults:
- this_result = {}
- this_result['table_name'] = dbresult.table_name
- if self.trait_type == type_dict[dbresult.table_name] or self.trait_type == 'all':
- this_result['key'] = dbresult.the_key
- this_result['result_fields'] = json.loads(dbresult.result_fields)
- this_species = this_result['result_fields']['species']
- this_group = this_result['result_fields']['group_name']
- if this_species not in self.species_groups:
- self.species_groups[this_species] = {}
- if type_dict[dbresult.table_name] not in self.species_groups[this_species]:
- self.species_groups[this_species][type_dict[dbresult.table_name]] = []
- if this_group not in self.species_groups[this_species][type_dict[dbresult.table_name]]:
- self.species_groups[this_species][type_dict[dbresult.table_name]].append(this_group)
- #if type_dict[dbresult.table_name] not in self.species_groups:
- # self.species_groups[type_dict[dbresult.table_name]] = {}
- #if this_species not in self.species_groups[type_dict[dbresult.table_name]]:
- # self.species_groups[type_dict[dbresult.table_name]][this_species] = []
- #if this_group not in self.species_groups[type_dict[dbresult.table_name]][this_species]:
- # self.species_groups[type_dict[dbresult.table_name]][this_species].append(this_group)
- self.results[type_dict[dbresult.table_name]].append(this_result)
-
- import redis
- Redis = redis.Redis()
#def get_group_species_tree(self):
# self.species_groups = collections.default_dict(list)
@@ -184,43 +122,6 @@ class SearchResultPage(object):
# item['result_fields']['group_name'])
- #def quick_search(self):
- # self.search_terms = parser.parse(self.search_terms)
- #
- # search_types = ["quick_mrna_assay", "quick_phenotype"]
- #
- # for search_category in search_types:
- # these_results = []
- # search_ob = do_search.DoSearch.get_search(search_category)
- # search_class = getattr(do_search, search_ob)
- # for a_search in self.search_terms:
- # search_term = a_search['search_term']
- # the_search = search_class(search_term)
- # these_results.extend(the_search.run())
- # print("in the search results are:", self.results)
- # self.results[search_category] = these_results
- #
- # #for a_search in self.search_terms:
- # # search_term = a_search['search_term']
- # #
- # # #Do mRNA assay search
- # # search_ob = do_search.DoSearch.get_search("quick_mrna_assay")
- # # search_class = getattr(do_search, search_ob)
- # # the_search = search_class(search_term)
- # #
- # # self.results.extend(the_search.run())
- # # print("in the search results are:", self.results)
- #
- #
- # #return True
- #
- # #search_gene
- # #search_geno
- # #search_pheno
- # #search_mrn
- # #search_publish
-
-
def search(self):
self.search_terms = parser.parse(self.search_terms)
print("After parsing:", self.search_terms)
diff --git a/wqflask/wqflask/show_trait/export_trait_data.py b/wqflask/wqflask/show_trait/export_trait_data.py
index f7f2d6d4..f5d02e73 100755
--- a/wqflask/wqflask/show_trait/export_trait_data.py
+++ b/wqflask/wqflask/show_trait/export_trait_data.py
@@ -21,6 +21,19 @@ def export_sample_table(targs):
def dict_to_sorted_list(dictionary):
sorted_list = [item for item in dictionary.iteritems()]
- sorted_list = sorted(sorted_list, key=operator.itemgetter(0))
+ sorted_list = sorted(sorted_list, cmp=cmp_samples)
sorted_values = [item[1] for item in sorted_list]
- return sorted_values \ No newline at end of file
+ return sorted_values
+
+def cmp_samples(a, b):
+ if b[0] == 'name':
+ return 1
+ elif b[0] == 'value':
+ if a[0] == 'se':
+ return 1
+ else:
+ return -1
+ elif b[0] == 'se':
+ return -1
+ else:
+ return 0 \ No newline at end of file
diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py
index aa6f9562..f7a33d4f 100755..100644
--- a/wqflask/wqflask/show_trait/show_trait.py
+++ b/wqflask/wqflask/show_trait/show_trait.py
@@ -16,7 +16,6 @@ from base import webqtlConfig
from base import webqtlCaseData
from wqflask.show_trait.SampleList import SampleList
from utility import webqtlUtil, Plot, Bunch, helper_functions
-from utility.tools import pylmm_command, plink_command
from base.trait import GeneralTrait
from base import data_set
from dbFunction import webqtlDatabaseFunction
@@ -24,8 +23,8 @@ from basicStatistics import BasicStatisticsFunctions
from pprint import pformat as pf
-PYLMM_PATH,PYLMM_COMMAND = pylmm_command()
-PLINK_PATH,PLINK_COMMAND = plink_command()
+from utility.tools import flat_files
+MAPPING_PATH = flat_files("mapping")
###############################################
#
@@ -34,8 +33,6 @@ PLINK_PATH,PLINK_COMMAND = plink_command()
#
##############################################
-
-
class ShowTrait(object):
def __init__(self, kw):
@@ -150,24 +147,27 @@ class ShowTrait(object):
self.get_mapping_methods()
- js_data = dict(sample_group_types = self.sample_group_types,
- sample_lists = sample_lists,
- attribute_names = self.sample_groups[0].attributes,
- temp_uuid = self.temp_uuid)
+ self.trait_table_width = get_trait_table_width(self.sample_groups)
+
+ js_data = dict(dataset_type = self.dataset.type,
+ data_scale = self.dataset.data_scale,
+ sample_group_types = self.sample_group_types,
+ sample_lists = sample_lists,
+ attribute_names = self.sample_groups[0].attributes,
+ temp_uuid = self.temp_uuid)
self.js_data = js_data
def get_mapping_methods(self):
'''Only display mapping methods when the dataset group's genotype file exists'''
def check_plink_gemma():
- if (os.path.isfile(PLINK_PATH+"/"+self.dataset.group.name+".bed") and
- os.path.isfile(PLINK_PATH+"/"+self.dataset.group.name+".map")):
-
+ if (os.path.isfile(MAPPING_PATH+"/"+self.dataset.group.name+".bed") and
+ os.path.isfile(MAPPING_PATH+"/"+self.dataset.group.name+".map")):
return True
else:
return False
def check_pylmm_rqtl():
- if os.path.isfile(webqtlConfig.GENODIR+self.dataset.group.name+".geno") and (os.path.getsize(webqtlConfig.NEWGENODIR+self.dataset.group.name+".json") > 0):
+ if os.path.isfile(webqtlConfig.GENODIR+self.dataset.group.name+".geno") and (os.path.getsize(webqtlConfig.JSON_GENODIR+self.dataset.group.name+".json") > 0):
return True
else:
return False
@@ -1184,17 +1184,16 @@ class ShowTrait(object):
all_samples_ordered = self.dataset.group.all_samples_ordered()
primary_sample_names = list(all_samples_ordered)
-
- print("self.dataset.group", pf(self.dataset.group.__dict__))
- print("-*- primary_samplelist is:", pf(primary_sample_names))
-
+
other_sample_names = []
for sample in this_trait.data.keys():
- if sample not in all_samples_ordered:
+ if (this_trait.data[sample].name2 in primary_sample_names) and (this_trait.data[sample].name not in primary_sample_names):
+ primary_sample_names.append(this_trait.data[sample].name)
+ primary_sample_names.remove(this_trait.data[sample].name2)
+ elif sample not in all_samples_ordered:
all_samples_ordered.append(sample)
other_sample_names.append(sample)
- print("species:", self.dataset.group.species)
if self.dataset.group.species == "human":
primary_sample_names += other_sample_names
@@ -1257,5 +1256,16 @@ def get_nearest_marker(this_trait, this_db):
else:
return result[0][0]
#return result[0][0], result[1][0]
+
+def get_trait_table_width(sample_groups):
+ table_width = 35
+ if sample_groups[0].se_exists():
+ table_width += 10
+ if (table_width + len(sample_groups[0].attributes)*10) > 100:
+ table_width = 100
+ else:
+ table_width += len(sample_groups[0].attributes)*10
+
+ return table_width
diff --git a/wqflask/wqflask/static/css b/wqflask/wqflask/static/css
deleted file mode 120000
index 9d8c2f68..00000000
--- a/wqflask/wqflask/static/css
+++ /dev/null
@@ -1 +0,0 @@
-../../../web/css \ No newline at end of file
diff --git a/wqflask/wqflask/static/dbdoc/TODO.md b/wqflask/wqflask/static/dbdoc/TODO.md
deleted file mode 100644
index c0a8bab7..00000000
--- a/wqflask/wqflask/static/dbdoc/TODO.md
+++ /dev/null
@@ -1 +0,0 @@
-TODO: Add all database documentation into this folder
diff --git a/wqflask/wqflask/static/images b/wqflask/wqflask/static/images
deleted file mode 120000
index 12f0f8b5..00000000
--- a/wqflask/wqflask/static/images
+++ /dev/null
@@ -1 +0,0 @@
-../../../web/images \ No newline at end of file
diff --git a/wqflask/wqflask/static/javascript b/wqflask/wqflask/static/javascript
deleted file mode 120000
index 5f58faf4..00000000
--- a/wqflask/wqflask/static/javascript
+++ /dev/null
@@ -1 +0,0 @@
-../../../web/javascript \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/css/corr_matrix.css b/wqflask/wqflask/static/new/css/corr_matrix.css
index 495ca28c..cd2b0a80 100755
--- a/wqflask/wqflask/static/new/css/corr_matrix.css
+++ b/wqflask/wqflask/static/new/css/corr_matrix.css
@@ -3,7 +3,7 @@
-moz-transform: rotate(-90deg);
-ms-transform: rotate(-90deg);
-o-transform: rotate(-90deg);
- trasnform: rotate(-90deg);
+ transform: rotate(-90deg);
color: #000
font-size: 22px;
height: 50px;
diff --git a/wqflask/wqflask/static/new/javascript/create_lodchart.coffee b/wqflask/wqflask/static/new/javascript/create_lodchart.coffee
index 472ec12d..88003f4e 100644
--- a/wqflask/wqflask/static/new/javascript/create_lodchart.coffee
+++ b/wqflask/wqflask/static/new/javascript/create_lodchart.coffee
@@ -46,9 +46,5 @@ create_lod_chart = ->
.transition().duration(500).attr("r", r)
$ ->
- #window.setTimeout ( ->
- # console.log(js_data)
- #), 1000
- #window.setTimeout(create_lod_chart(), 1000)
root.create_lod_chart = create_lod_chart
diff --git a/wqflask/wqflask/static/new/javascript/create_lodchart.js b/wqflask/wqflask/static/new/javascript/create_lodchart.js
index c756d842..778eed3a 100644
--- a/wqflask/wqflask/static/new/javascript/create_lodchart.js
+++ b/wqflask/wqflask/static/new/javascript/create_lodchart.js
@@ -1,45 +1,50 @@
-// Generated by CoffeeScript 1.9.2
-(function() {
- var create_lod_chart;
+//var create_lod_chart;
- create_lod_chart = function() {
- var chrrect, data, h, halfh, margin, mychart, totalh, totalw, w;
- h = 500;
- w = 1200;
- margin = {
- left: 60,
- top: 40,
- right: 40,
- bottom: 40,
- inner: 5
- };
- halfh = h + margin.top + margin.bottom;
- totalh = halfh * 2;
- totalw = w + margin.left + margin.right;
- console.log("js_data:", js_data);
- mychart = lodchart().lodvarname("lod.hk").height(h).width(w).margin(margin).ylab(js_data.result_score_type + " score").mappingScale(js_data.mapping_scale).manhattanPlot(js_data.manhattan_plot);
- data = js_data.json_data;
- d3.select("div#topchart").datum(data).call(mychart);
- chrrect = mychart.chrSelect();
- chrrect.on("mouseover", function() {
- return d3.select(this).attr("fill", "#E9CFEC");
- }).on("mouseout", function(d, i) {
- return d3.select(this).attr("fill", function() {
- if (i % 2) {
- return "#F1F1F9";
- }
- return "#FBFBFF";
- });
- });
- return mychart.markerSelect().on("click", function(d) {
- var r;
- r = d3.select(this).attr("r");
- return d3.select(this).transition().duration(500).attr("r", r * 3).transition().duration(500).attr("r", r);
- });
+create_lod_chart = function() {
+ var additive, chrrect, data, h, halfh, margin, mychart, totalh, totalw, w;
+ h = 500;
+ w = 1200;
+ margin = {
+ left: 60,
+ top: 40,
+ right: 40,
+ bottom: 40,
+ inner: 5
};
-
- $(function() {
- return root.create_lod_chart = create_lod_chart;
+ halfh = h + margin.top + margin.bottom;
+ totalh = halfh * 2;
+ totalw = w + margin.left + margin.right;
+ if ('additive' in js_data) {
+ additive = js_data.additive;
+ } else {
+ additive = false;
+ }
+ console.log("js_data:", js_data);
+ mychart = lodchart().lodvarname("lod.hk").height(h).width(w).margin(margin).ylab(js_data.result_score_type + " score").manhattanPlot(js_data.manhattan_plot);
+ data = js_data.json_data;
+ d3.select("div#topchart").datum(data).call(mychart);
+ chrrect = mychart.chrSelect();
+ chrrect.on("mouseover", function() {
+ return d3.select(this).attr("fill", "#E9CFEC");
+ }).on("mouseout", function(d, i) {
+ return d3.select(this).attr("fill", function() {
+ if (i % 2) {
+ return "#F1F1F9";
+ }
+ return "#FBFBFF";
+ });
+ });
+ return mychart.markerSelect().on("click", function(d) {
+ var r;
+ r = d3.select(this).attr("r");
+ return d3.select(this).transition().duration(500).attr("r", r * 3).transition().duration(500).attr("r", r);
});
+};
+
+create_lod_chart()
-}).call(this);
+/*
+$(function() {
+ return root.create_lod_chart = create_lod_chart;
+});
+*/ \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/javascript/dataset_menu_structure.json b/wqflask/wqflask/static/new/javascript/dataset_menu_structure.json
index 2154541c..12a30e84 100755
--- a/wqflask/wqflask/static/new/javascript/dataset_menu_structure.json
+++ b/wqflask/wqflask/static/new/javascript/dataset_menu_structure.json
@@ -117,14 +117,14 @@
"Barley1 Leaf MAS 5.0 SCRI (Dec06)"
],
[
- "126",
- "B30_K_1206_Rn",
- "Barley1 Leaf gcRMAn SCRI (Dec06)"
- ],
- [
"125",
"B30_K_1206_R",
"Barley1 Leaf gcRMA SCRI (Dec06)"
+ ],
+ [
+ "126",
+ "B30_K_1206_Rn",
+ "Barley1 Leaf gcRMAn SCRI (Dec06)"
]
],
"Phenotypes": [
@@ -1340,14 +1340,14 @@
"GSE9588 Human Liver Normal (Mar11) Both Sexes"
],
[
- "383",
- "HLCM_0311",
- "GSE9588 Human Liver Normal (Mar11) Males"
- ],
- [
"384",
"HLCF_0311",
"GSE9588 Human Liver Normal (Mar11) Females"
+ ],
+ [
+ "383",
+ "HLCM_0311",
+ "GSE9588 Human Liver Normal (Mar11) Males"
]
],
"Phenotypes": [
@@ -1510,14 +1510,14 @@
"NCI Mammary LMT miRNA v2 (Apr09) RMA"
],
[
- "37",
- "MA_M_0704_R",
- "NCI Mammary mRNA M430 (July04) RMA"
- ],
- [
"36",
"MA_M_0704_M",
"NCI Mammary mRNA M430 (July04) MAS5"
+ ],
+ [
+ "37",
+ "MA_M_0704_R",
+ "NCI Mammary mRNA M430 (July04) RMA"
]
]
},
@@ -1575,14 +1575,14 @@
],
"Liver mRNA": [
[
- "39",
- "LVF2_M_0704_R",
- "(B6 x BTBR)F2-ob/ob Liver mRNA M430 (Jul04) RMA"
- ],
- [
"38",
"LVF2_M_0704_M",
"(B6 x BTBR)F2-ob/ob Liver mRNA M430 (Jul04) MAS5"
+ ],
+ [
+ "39",
+ "LVF2_M_0704_R",
+ "(B6 x BTBR)F2-ob/ob Liver mRNA M430 (Jul04) RMA"
]
],
"Phenotypes": [
@@ -1616,14 +1616,14 @@
"OHSU/VA B6D2F2 Brain mRNA M430A (Mar04) PDNN"
],
[
- "32",
- "BRF2_M_0304_R",
- "OHSU/VA B6D2F2 Brain mRNA M430A (Mar04) RMA"
- ],
- [
"31",
"BRF2_M_0304_M",
"OHSU/VA B6D2F2 Brain mRNA M430A (Mar04) MAS5"
+ ],
+ [
+ "32",
+ "BRF2_M_0304_R",
+ "OHSU/VA B6D2F2 Brain mRNA M430A (Mar04) RMA"
]
],
"Genotypes": [
@@ -1685,11 +1685,6 @@
],
"Striatum mRNA": [
[
- "84",
- "SA_M2_0905_R",
- "OHSU/VA B6D2F2 Striatum M430v2 (Sep05) RMA"
- ],
- [
"83",
"SA_M2_0905_M",
"OHSU/VA B6D2F2 Striatum M430v2 (Sep05) MAS5"
@@ -1698,22 +1693,27 @@
"85",
"SA_M2_0905_P",
"OHSU/VA B6D2F2 Striatum M430v2 (Sep05) PDNN"
+ ],
+ [
+ "84",
+ "SA_M2_0905_R",
+ "OHSU/VA B6D2F2 Striatum M430v2 (Sep05) RMA"
]
]
},
"BHF2": {
"Adipose mRNA": [
[
- "196",
- "UCLA_BHF2_ADIPOSE_MALE",
- "UCLA BHF2 Adipose Male mlratio"
- ],
- [
"197",
"UCLA_BHF2_ADIPOSE_FEMALE",
"UCLA BHF2 Adipose Female mlratio"
],
[
+ "196",
+ "UCLA_BHF2_ADIPOSE_MALE",
+ "UCLA BHF2 Adipose Male mlratio"
+ ],
+ [
"165",
"UCLA_BHF2_ADIPOSE_0605",
"UCLA BHF2 Adipose (June05) mlratio"
@@ -1721,16 +1721,16 @@
],
"Brain mRNA": [
[
- "198",
- "UCLA_BHF2_BRAIN_MALE",
- "UCLA BHF2 Brain Male mlratio"
- ],
- [
"199",
"UCLA_BHF2_BRAIN_FEMALE",
"UCLA BHF2 Brain Female mlratio"
],
[
+ "198",
+ "UCLA_BHF2_BRAIN_MALE",
+ "UCLA BHF2 Brain Male mlratio"
+ ],
+ [
"166",
"UCLA_BHF2_BRAIN_0605",
"UCLA BHF2 Brain (June05) mlratio"
@@ -1745,16 +1745,16 @@
],
"Liver mRNA": [
[
- "200",
- "UCLA_BHF2_LIVER_MALE",
- "UCLA BHF2 Liver Male mlratio"
- ],
- [
"201",
"UCLA_BHF2_LIVER_FEMALE",
"UCLA BHF2 Liver Female mlratio"
],
[
+ "200",
+ "UCLA_BHF2_LIVER_MALE",
+ "UCLA BHF2 Liver Male mlratio"
+ ],
+ [
"167",
"UCLA_BHF2_LIVER_0605",
"UCLA BHF2 Liver (June05) mlratio"
@@ -1846,6 +1846,18 @@
]
},
"BXD": {
+ "Adipose Proteome": [
+ [
+ "797",
+ "EPFL_AdiPro0416",
+ "EPFL/ETHZ BXD Brown Adipose, Total Tissue Proteome, Chow Diet (Apr16) Light SWATH **"
+ ],
+ [
+ "798",
+ "EPFL_AdiMitPro0416",
+ "EPFL/ETHZ BXD Brown Adipose, Isolated Mitochondria Proteome, Chow Diet (Apr16) Light SWATH **"
+ ]
+ ],
"Adipose mRNA": [
[
"469",
@@ -1916,21 +1928,21 @@
[
"414",
"UCLA_BXD-on_Femur_0113_RSN",
- "UCLA GSE27483 BXD Only Bone Femur ILM Mouse WG-6 v2.0 (Jan13) RSN"
+ "UCLA GSE27483 BXD Only Bone Femur ILM Mouse WG-6 v1.1 (Jan13) RSN"
]
],
"Brain mRNA": [
[
- "164",
- "UTHSC_BXD_WB_RNASeq1112",
- "UTHSC Mouse BXD Whole Brain RNA Sequence (Nov12) RPKM Untrimmed"
- ],
- [
"590",
"UTHSC_BXD_WB_RNASeqtrim1_1112",
"UTHSC Mouse BXD Whole Brain RNA Sequence (Nov12) RPKM Trimmed 1.0"
],
[
+ "164",
+ "UTHSC_BXD_WB_RNASeq1112",
+ "UTHSC Mouse BXD Whole Brain RNA Sequence (Nov12) RPKM Untrimmed"
+ ],
+ [
"394",
"UTHSC_BXD_WB_RNASeqEx1112",
"UTHSC Mouse BXD Whole Brain RNA Sequence Exon Level (Nov12) RPKM"
@@ -1946,11 +1958,6 @@
"UTHSC Brain mRNA U74Av2 (Nov05) PDNN"
],
[
- "80",
- "BR_U_0805_M",
- "UTHSC Brain mRNA U74Av2 (Aug05) MAS5"
- ],
- [
"82",
"BR_U_0805_R",
"UTHSC Brain mRNA U74Av2 (Aug05) RMA"
@@ -1961,6 +1968,11 @@
"UTHSC Brain mRNA U74Av2 (Aug05) PDNN"
],
[
+ "80",
+ "BR_U_0805_M",
+ "UTHSC Brain mRNA U74Av2 (Aug05) MAS5"
+ ],
+ [
"42",
"CB_M_0204_P",
"INIA Brain mRNA M430 (Feb04) PDNN"
@@ -2164,6 +2176,21 @@
"UMUTAffy Hippocampus Exon (Feb09) RMA"
],
[
+ "780",
+ "UTHSC_ILM_BXD_hipp_NOEb_0216",
+ "UTHSC BXD Hippocampus ILM v6.1 NOE Balanced (Feb16) RankInv"
+ ],
+ [
+ "781",
+ "UTHSC_ILM_BXD_hipp_RSEb_0216",
+ "UTHSC BXD Hippocampus ILM v6.1 RSE Balanced (Feb16) RankInv"
+ ],
+ [
+ "782",
+ "UTHSC_ILM_BXD_hipp_RSSb_0216",
+ "UTHSC BXD Hippocampus ILM v6.1 RSS Balanced (Feb16) RankInv"
+ ],
+ [
"291",
"UT_ILM_BXD_hipp_5T_1112",
"UTHSC Hippocampus Illumina v6.1 All Combined (Nov12) RankInv"
@@ -2283,14 +2310,14 @@
"Mouse Kidney M430v2 Sex Balanced (Aug06) PDNN"
],
[
- "116",
- "MA_M2_0706_P",
- "Mouse Kidney M430v2 (Jul06) PDNN"
- ],
- [
"115",
"MA_M2_0706_R",
"Mouse Kidney M430v2 (Jul06) RMA"
+ ],
+ [
+ "116",
+ "MA_M2_0706_P",
+ "Mouse Kidney M430v2 (Jul06) PDNN"
]
],
"Liver Metabolome": [
@@ -2452,16 +2479,16 @@
],
"Neocortex mRNA": [
[
- "375",
- "DevNeocortex_ILM6.2P14RInv_1111",
- "BIDMC/UTHSC Dev Neocortex P14 ILMv6.2 (Nov11) RankInv"
- ],
- [
"374",
"DevNeocortex_ILM6.2P3RInv_1111",
"BIDMC/UTHSC Dev Neocortex P3 ILMv6.2 (Nov11) RankInv"
],
[
+ "375",
+ "DevNeocortex_ILM6.2P14RInv_1111",
+ "BIDMC/UTHSC Dev Neocortex P14 ILMv6.2 (Nov11) RankInv"
+ ],
+ [
"284",
"HQFNeoc_1210v2_RankInv",
"HQF BXD Neocortex ILM6v1.1 (Dec10v2) RankInv"
@@ -2477,14 +2504,14 @@
"HQF BXD Neocortex ILM6v1.1 (Feb08) RankInv"
],
[
- "274",
- "DevNeocortex_ILM6.2P3RInv_1110",
- "BIDMC/UTHSC Dev Neocortex P3 ILMv6.2 (Nov10) RankInv"
- ],
- [
"275",
"DevNeocortex_ILM6.2P14RInv_1110",
"BIDMC/UTHSC Dev Neocortex P14 ILMv6.2 (Nov10) RankInv"
+ ],
+ [
+ "274",
+ "DevNeocortex_ILM6.2P3RInv_1110",
+ "BIDMC/UTHSC Dev Neocortex P3 ILMv6.2 (Nov10) RankInv"
]
],
"Nucleus Accumbens mRNA": [
@@ -2542,29 +2569,29 @@
],
"Retina mRNA": [
[
+ "267",
+ "Illum_Retina_BXD_RankInv0410",
+ "Full HEI Retina Illumina V6.2 (Apr10) RankInv"
+ ],
+ [
+ "302",
+ "G2NEI_ILM_Retina_BXD_RI0410",
+ "HEI Retina Normal Illumina V6.2 (Apr10) RankInv"
+ ],
+ [
"709",
"DoDCMMRPRetMoGene2_0515",
- "DoD CDMRP Retina Affy MoGene 2.0 ST (May15) RMA Gene Level"
+ "DoD Retina Normal Affy MoGene 2.0 ST (May15) RMA Gene Level"
],
[
"710",
"DoDCMMRPRetMoGene2Ex_0515",
- "DoD CDMRP Retina Affy MoGene 2.0 ST (May15) RMA Exon Level"
+ "DoD Retina Normal Affy MoGene 2.0 ST (May15) RMA Exon Level"
],
[
"385",
"ONCRetILM6_0412",
"ONC HEI Retina (April 2012) RankInv"
- ],
- [
- "302",
- "G2NEI_ILM_Retina_BXD_RI0410",
- "Normal HEI Retina (April 2010) RankInv"
- ],
- [
- "267",
- "Illum_Retina_BXD_RankInv0410",
- "Full HEI Retina (April 2010) RankInv"
]
],
"Spleen mRNA": [
@@ -2689,6 +2716,23 @@
"RTC_1106_R",
"HZI Treg M430v2 (Feb11) RMA"
]
+ ],
+ "Ventral Tegmental Area mRNA": [
+ [
+ "228",
+ "VCUSal_0609_R",
+ "VCU BXD VTA Sal M430 2.0 (Jun09) RMA"
+ ],
+ [
+ "230",
+ "VCUEtvsSal_0609_R",
+ "VCU BXD VTA Et vs Sal M430 2.0 (Jun09) RMA"
+ ],
+ [
+ "229",
+ "VCUEtOH_0609_R",
+ "VCU BXD VTA EtOH M430 2.0 (Jun09) RMA"
+ ]
]
},
"BXH": {
@@ -2795,6 +2839,16 @@
"170",
"UCLA_CTB6B6CTF2_ADIPOSE_2005",
"UCLA CTB6/B6CTF2 Adipose (2005) mlratio"
+ ],
+ [
+ "189",
+ "UCLA_CTB6B6CTF2_ADIPOSE_FEMALE",
+ "UCLA CTB6B6CTF2 Adipose Female mlratio"
+ ],
+ [
+ "188",
+ "UCLA_CTB6B6CTF2_ADIPOSE_MALE",
+ "UCLA CTB6B6CTF2 Adipose Male mlratio"
]
],
"Brain mRNA": [
@@ -2826,6 +2880,16 @@
"172",
"UCLA_CTB6B6CTF2_LIVER_2005",
"UCLA CTB6/B6CTF2 Liver (2005) mlratio"
+ ],
+ [
+ "193",
+ "UCLA_CTB6B6CTF2_LIVER_FEMALE",
+ "UCLA CTB6B6CTF2 Liver Female mlratio"
+ ],
+ [
+ "192",
+ "UCLA_CTB6B6CTF2_LIVER_MALE",
+ "UCLA CTB6B6CTF2 Liver Male mlratio"
]
],
"Muscle mRNA": [
@@ -2833,6 +2897,16 @@
"173",
"UCLA_CTB6B6CTF2_MUSCLE_2005",
"UCLA CTB6/B6CTF2 Muscle (2005) mlratio"
+ ],
+ [
+ "195",
+ "UCLA_CTB6B6CTF2_MUSCLE_FEMALE",
+ "UCLA CTB6B6CTF2 Muscle Female mlratio"
+ ],
+ [
+ "194",
+ "UCLA_CTB6B6CTF2_MUSCLE_MALE",
+ "UCLA CTB6B6CTF2 Muscle Male mlratio"
]
],
"Phenotypes": [
@@ -2853,14 +2927,14 @@
],
"Hippocampus mRNA": [
[
- "100",
- "HC_M2CB_1205_R",
- "Hippocampus Consortium M430v2 CXB (Dec05) RMA"
- ],
- [
"99",
"HC_M2CB_1205_P",
"Hippocampus Consortium M430v2 CXB (Dec05) PDNN"
+ ],
+ [
+ "100",
+ "HC_M2CB_1205_R",
+ "Hippocampus Consortium M430v2 CXB (Dec05) RMA"
]
],
"Phenotypes": [
@@ -2927,11 +3001,6 @@
],
"Hippocampus mRNA": [
[
- "219",
- "Illum_LXS_Hipp_NON_1008",
- "Hippocampus Illumina NON (Oct08) RankInv beta"
- ],
- [
"212",
"Illum_LXS_Hipp_RSE_1008",
"Hippocampus Illumina RSE (Oct08) RankInv beta"
@@ -2952,6 +3021,11 @@
"Hippocampus Illumina NOS (Oct08) RankInv beta"
],
[
+ "219",
+ "Illum_LXS_Hipp_NON_1008",
+ "Hippocampus Illumina NON (Oct08) RankInv beta"
+ ],
+ [
"143",
"Illum_LXS_Hipp_loess0807",
"Hippocampus Illumina (Aug07) LOESS"
@@ -3042,14 +3116,14 @@
],
"Hippocampus mRNA": [
[
- "273",
- "UMUTAffyExon_0209_RMA_MDP",
- "UMUTAffy Hippocampus Exon (Feb09) RMA MDP"
- ],
- [
"272",
"HC_M2_0606_MDP",
"Hippocampus Consortium M430v2 (Jun06) RMA MDP"
+ ],
+ [
+ "273",
+ "UMUTAffyExon_0209_RMA_MDP",
+ "UMUTAffy Hippocampus Exon (Feb09) RMA MDP"
]
],
"Liver mRNA": [
@@ -3115,16 +3189,32 @@
"Scripps-2013": {}
},
"rat": {
- "HSNIH": {
+ "HSNIH-Palmer": {
"Phenotypes": [
[
- "619",
- "HSNIHPublish",
- "HSNIH Published Phenotypes"
+ "None",
+ "HSNIH-PalmerPublish",
+ "HSNIH-Palmer Published Phenotypes"
+ ]
+ ]
+ },
+ "HSNIH-RGSMC": {
+ "Phenotypes": [
+ [
+ "None",
+ "HSNIH-RGSMCPublish",
+ "HSNIH-RGSMC Published Phenotypes"
]
]
},
"HXBBXH": {
+ "Adipose mRNA": [
+ [
+ "799",
+ "FGUCAS_BAdip0516",
+ "FGUCAS BXH/HXB Brown Adipose Affy Rat Gene 2.0 ST (May16) log2 **"
+ ]
+ ],
"Adrenal Gland mRNA": [
[
"220",
@@ -3445,8 +3535,12 @@
],
"rat": [
[
- "HSNIH",
- "NIH Heterogeneous Stock"
+ "HSNIH-Palmer",
+ "NIH Heterogeneous Stock (Palmer)"
+ ],
+ [
+ "HSNIH-RGSMC",
+ "NIH Heterogeneous Stock (RGSMC 2013)"
],
[
"HXBBXH",
@@ -4336,6 +4430,10 @@
"Adipose mRNA"
],
[
+ "Adipose Proteome",
+ "Adipose Proteome"
+ ],
+ [
"Adrenal Gland mRNA",
"Adrenal Gland mRNA"
],
@@ -4450,6 +4548,10 @@
[
"T Cell (regulatory) mRNA",
"T Cell (regulatory) mRNA"
+ ],
+ [
+ "Ventral Tegmental Area mRNA",
+ "Ventral Tegmental Area mRNA"
]
],
"BXH": [
@@ -4641,7 +4743,13 @@
"Scripps-2013": []
},
"rat": {
- "HSNIH": [
+ "HSNIH-Palmer": [
+ [
+ "Phenotypes",
+ "Phenotypes"
+ ]
+ ],
+ "HSNIH-RGSMC": [
[
"Phenotypes",
"Phenotypes"
@@ -4657,6 +4765,10 @@
"Genotypes"
],
[
+ "Adipose mRNA",
+ "Adipose mRNA"
+ ],
+ [
"Adrenal Gland mRNA",
"Adrenal Gland mRNA"
],
diff --git a/wqflask/wqflask/static/new/javascript/draw_probability_plot.js b/wqflask/wqflask/static/new/javascript/draw_probability_plot.js
index 3eb6295f..1eeb6e73 100644
--- a/wqflask/wqflask/static/new/javascript/draw_probability_plot.js
+++ b/wqflask/wqflask/static/new/javascript/draw_probability_plot.js
@@ -46,7 +46,7 @@
chart.pointRange([50, 50]);
chart.legend.updateState(false);
chart.xAxis.axisLabel("Theoretical quantiles").tickFormat(d3.format('.02f'));
- chart.yAxis.axisLabel("Sample quantiles").tickFormat(d3.format('.02f'));
+ //chart.yAxis.axisLabel("Sample quantiles").tickFormat(d3.format('.02f'));
chart.tooltipContent(function(obj) {
return '<b style="font-size: 20px">' + obj.point.name + '</b>';
});
@@ -66,15 +66,20 @@
sorted_names = names.sort(function(x, y) {
return all_samples[x].value - all_samples[y].value;
});
+ max_decimals = 0
sorted_values = (function() {
var j, len, results;
results = [];
for (j = 0, len = sorted_names.length; j < len; j++) {
x = sorted_names[j];
results.push(all_samples[x].value);
+ if (all_samples[x].value.countDecimals() > max_decimals) {
+ max_decimals = all_samples[x].value.countDecimals()-1
+ }
}
return results;
})();
+ chart.yAxis.axisLabel("Sample quantiles").tickFormat(d3.format('.0'+max_decimals.toString()+'f'));
sw_result = ShapiroWilkW(sorted_values);
W = sw_result.w.toFixed(3);
pvalue = sw_result.p.toFixed(3);
diff --git a/wqflask/wqflask/static/new/javascript/show_trait.js b/wqflask/wqflask/static/new/javascript/show_trait.js
index 1dd54e3a..589b1074 100755..100644
--- a/wqflask/wqflask/static/new/javascript/show_trait.js
+++ b/wqflask/wqflask/static/new/javascript/show_trait.js
@@ -50,7 +50,7 @@
}, {
vn: "interquartile",
pretty: "Interquartile Range",
- url: "/glossary.html#Interquartile",
+ url: "http://www.genenetwork.org/glossary.html#Interquartile",
digits: 2
}
];
@@ -174,7 +174,6 @@
make_table = function() {
var header, key, row, row_line, table, the_id, the_rows, value, _i, _len, _ref, _ref1;
header = "<thead><tr><th>&nbsp;</th>";
- console.log("js_data.sample_group_types:", js_data.sample_group_types);
_ref = js_data.sample_group_types;
for (key in _ref) {
if (!__hasProp.call(_ref, key)) continue;
@@ -186,14 +185,15 @@
the_rows = "<tbody>";
for (_i = 0, _len = Stat_Table_Rows.length; _i < _len; _i++) {
row = Stat_Table_Rows[_i];
- console.log("rowing");
+ if ((row.vn == "range_fold" || row.vn == "range") && js_data.dataset_type == "Publish"){
+ continue;
+ }
row_line = "<tr>";
if (row.url != null) {
row_line += "<td id=\"" + row.vn + "\"><a href=\"" + row.url + "\">" + row.pretty + "</a></td>";
} else {
row_line += "<td id=\"" + row.vn + "\">" + row.pretty + "</td>";
}
- console.log("box - js_data.sample_group_types:", js_data.sample_group_types);
_ref1 = js_data.sample_group_types;
for (key in _ref1) {
if (!__hasProp.call(_ref1, key)) continue;
@@ -202,12 +202,10 @@
row_line += "<td id=\"" + the_id + "\">foo</td>";
}
row_line += "</tr>";
- console.log("row line:", row_line);
the_rows += row_line;
}
the_rows += "</tbody>";
table = header + the_rows;
- console.log("table is:", table);
return $("#stats_table").append(table);
};
process_id = function() {
@@ -298,18 +296,37 @@
};
on_corr_method_change = function() {
var corr_method;
- console.log("in beginning of on_corr_method_change");
- corr_method = $('select[name=corr_method]').val();
+ corr_method = $('select[name=corr_type]').val();
console.log("corr_method is:", corr_method);
$('.correlation_desc').hide();
$('#' + corr_method + "_r_desc").show().effect("highlight");
if (corr_method === "lit") {
- return $("#corr_sample_method_options").hide();
+ return $("#corr_sample_method").hide();
} else {
- return $("#corr_sample_method_options").show();
+ return $("#corr_sample_method").show();
}
};
- $('select[name=corr_method]').change(on_corr_method_change);
+ $('select[name=corr_type]').change(on_corr_method_change);
+
+ submit_special = function(url) {
+ $("#trait_data_form").attr("action", url);
+ return $("#trait_data_form").submit();
+ };
+
+ submit_corr = function(){
+ var url;
+ url = "/corr_compute";
+ return submit_special(url);
+ };
+
+ $(".corr_compute").on("click", (function(_this) {
+ return function() {
+ var url;
+ url = "/corr_compute";
+ return submit_special(url);
+ };
+ })(this));
+
create_value_dropdown = function(value) {
return "<option val=" + value + ">" + value + "</option>";
};
@@ -504,5 +521,10 @@
$('#reset').click(edit_data_change);
return console.log("end");
});
+
+ Number.prototype.countDecimals = function () {
+ if(Math.floor(this.valueOf()) === this.valueOf()) return 0;
+ return this.toString().split(".")[1].length || 0;
+ }
}).call(this);
diff --git a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js
index 3637233e..3b1a1205 100755
--- a/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js
+++ b/wqflask/wqflask/static/new/javascript/show_trait_mapping_tools.js
@@ -3,11 +3,9 @@
var block_outliers, composite_mapping_fields, do_ajax_post, get_progress, mapping_method_fields, open_mapping_results, outlier_text, showalert, submit_special, toggle_enable_disable, update_time_remaining;
submit_special = function(url) {
- //var url;
console.log("In submit_special");
console.log("this is:", this);
console.log("$(this) is:", $(this));
- //url = $(this).data("url");
console.log("url is:", url);
$("#trait_data_form").attr("action", url);
return $("#trait_data_form").submit();
@@ -137,6 +135,8 @@
outlier_text = "One or more outliers exist in this data set. Please review values before mapping. Including outliers when mapping may lead to misleading results. We recommend <A HREF=\"http://en.wikipedia.org/wiki/Winsorising\">winsorising</A> the outliers or simply deleting them.";
+ runtime_warning_text = "This function could take as long as 10-20 minutes to run, so please do not close your browser window until it finishes."
+
showalert = function(message, alerttype) {
return $('#alert_placeholder').append('<div id="alertdiv" class="alert ' + alerttype + '"><a class="close" data-dismiss="alert">�</a><span>' + message + '</span></div>');
};
@@ -189,8 +189,20 @@
$('input[name=do_control]').val($('input[name=do_control_rqtl]:checked').val());
form_data = $('#trait_data_form').serialize();
console.log("form_data is:", form_data);
- return submit_special(url);
- //return do_ajax_post(url, form_data);
+ if ($('input[name=pair_scan]:checked').val() == "true") {
+ console.log("PAIR SCAN:", $('input[name=pair_scan]:checked').val())
+ run_pair_scan = confirm(runtime_warning_text)
+ if (run_pair_scan == true) {
+ submit_special(url);
+ }
+ else {
+ return false
+ }
+ }
+ else {
+ return submit_special(url);
+ //return do_ajax_post(url, form_data);
+ }
};
})(this));
@@ -230,9 +242,10 @@
//$("#progress_bar_container").modal();
url = "/marker_regression";
$('input[name=method]').val("reaper");
- $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val());
+ $('input[name=num_perm]').val($('input[name=num_perm_reaper]').val());
$('input[name=control_marker]').val($('input[name=control_reaper]').val());
$('input[name=do_control]').val($('input[name=do_control_reaper]:checked').val());
+ $('input[name=manhattan_plot]').val($('input[name=manhattan_plot_reaper]:checked').val());
$('input[name=mapping_display_all]').val($('input[name=display_all_reaper]'));
$('input[name=suggestive]').val($('input[name=suggestive_reaper]'));
form_data = $('#trait_data_form').serialize();
diff --git a/wqflask/wqflask/static/new/packages/DataTables/css/jquery.dataTables.css b/wqflask/wqflask/static/new/packages/DataTables/css/jquery.dataTables.css
index 931ec6b3..6540d01f 100755
--- a/wqflask/wqflask/static/new/packages/DataTables/css/jquery.dataTables.css
+++ b/wqflask/wqflask/static/new/packages/DataTables/css/jquery.dataTables.css
@@ -20,7 +20,7 @@ table.dataTable tfoot th {
}
table.dataTable thead th,
table.dataTable thead td {
- padding: 10px 18px;
+ padding: 10px 18px 10px 0px;
border-bottom: 1px solid #111;
}
table.dataTable thead th:active,
@@ -69,7 +69,7 @@ table.dataTable tbody tr.selected {
}
table.dataTable tbody th,
table.dataTable tbody td {
- padding: 8px 10px;
+ padding: 4px 5px;
}
table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
border-top: 1px solid #ddd;
diff --git a/wqflask/wqflask/static/new/packages/DataTables/js/dataTables.naturalSort.js b/wqflask/wqflask/static/new/packages/DataTables/js/dataTables.naturalSort.js
index c9e26682..8b7fa8fd 100755
--- a/wqflask/wqflask/static/new/packages/DataTables/js/dataTables.naturalSort.js
+++ b/wqflask/wqflask/static/new/packages/DataTables/js/dataTables.naturalSort.js
@@ -1,56 +1,68 @@
-(function() {
-
-/*
- * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
- * Author: Jim Palmer (based on chunking idea from Dave Koelle)
- * Contributors: Mike Grier (mgrier.com), Clint Priest, Kyle Adams, guillermo
- * See: http://js-naturalsort.googlecode.com/svn/trunk/naturalSort.js
- */
-function naturalSort (a, b) {
- var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
- sre = /(^[ ]*|[ ]*$)/g,
- dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
- hre = /^0x[0-9a-f]+$/i,
- ore = /^0/,
- // convert all to strings and trim()
- x = a.toString().replace(sre, '') || '',
- y = b.toString().replace(sre, '') || '',
- // chunk/tokenize
- xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
- yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
- // numeric, hex or date detection
- xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)),
- yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null;
- // first try and sort Hex codes or Dates
- if (yD)
- if ( xD < yD ) return -1;
- else if ( xD > yD ) return 1;
- // natural sorting through split numeric strings and default strings
- for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
- // find floats not starting with '0', string or 0 if not defined (Clint Priest)
- var oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
- var oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
- // handle numeric vs string comparison - number < string - (Kyle Adams)
- if (isNaN(oFxNcL) !== isNaN(oFyNcL)) return (isNaN(oFxNcL)) ? 1 : -1;
- // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
- else if (typeof oFxNcL !== typeof oFyNcL) {
- oFxNcL += '';
- oFyNcL += '';
- }
- if (oFxNcL < oFyNcL) return -1;
- if (oFxNcL > oFyNcL) return 1;
- }
- return 0;
-}
-
-jQuery.extend( jQuery.fn.dataTableExt.oSort, {
- "natural-asc": function ( a, b ) {
- return naturalSort(a,b);
- },
-
- "natural-desc": function ( a, b ) {
- return naturalSort(a,b) * -1;
- }
-} );
-
+(function() {
+
+/*
+ * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
+ * Author: Jim Palmer (based on chunking idea from Dave Koelle)
+ * Contributors: Mike Grier (mgrier.com), Clint Priest, Kyle Adams, guillermo
+ * See: http://js-naturalsort.googlecode.com/svn/trunk/naturalSort.js
+ */
+function naturalSort (a, b) {
+ var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
+ sre = /(^[ ]*|[ ]*$)/g,
+ dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
+ hre = /^0x[0-9a-f]+$/i,
+ ore = /^0/,
+ // convert all to strings and trim()
+ x = a.toString().replace(sre, '') || '',
+ y = b.toString().replace(sre, '') || '',
+ // chunk/tokenize
+ xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
+ yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
+ // numeric, hex or date detection
+ xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)),
+ yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null;
+
+ // first try and sort Hex codes or Dates
+ if (yD)
+ if ( xD < yD ) return -1;
+ else if ( xD > yD ) return 1;
+
+ // natural sorting through split numeric strings and default strings
+ for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
+ // find floats not starting with '0', string or 0 if not defined (Clint Priest)
+ var oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
+ var oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
+ // handle numeric vs string comparison - number < string - (Kyle Adams)
+ if (isNaN(oFxNcL) !== isNaN(oFyNcL)) return (isNaN(oFxNcL)) ? 1 : -1;
+ // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
+ else if (typeof oFxNcL !== typeof oFyNcL) {
+ oFxNcL += '';
+ oFyNcL += '';
+ }
+ if (oFxNcL < oFyNcL) return -1;
+ if (oFxNcL > oFyNcL) return 1;
+ }
+
+ return 0;
+}
+
+jQuery.extend( jQuery.fn.dataTableExt.oSort, {
+ "natural-asc": function ( a, b ) {
+ // first check if null or n/a
+ if (a == "N/A" || a == "NA" || a == "" || a == "--") return 1;
+ else if (b == "N/A" || b == "NA" || b == "" || b == "--") return -1;
+ else {
+ return naturalSort(a,b);
+ }
+ },
+
+ "natural-desc": function ( a, b ) {
+ if (a == "N/A" || a == "NA" || a == "" || a == "--") return 1;
+ else if (b == "N/A" || b == "NA" || b == "" || b == "--") return -1;
+ else {
+ return naturalSort(a,b) * -1;
+ }
+ }
+} );
+
}()); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/additional-methods.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/additional-methods.js
deleted file mode 100644
index df41fbd4..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/additional-methods.js
+++ /dev/null
@@ -1,998 +0,0 @@
-/*!
- * jQuery Validation Plugin v1.14.0
- *
- * http://jqueryvalidation.org/
- *
- * Copyright (c) 2015 Jörn Zaefferer
- * Released under the MIT license
- */
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "./jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-(function() {
-
- function stripHtml(value) {
- // remove html tags and space chars
- return value.replace(/<.[^<>]*?>/g, " ").replace(/&nbsp;|&#160;/gi, " ")
- // remove punctuation
- .replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "");
- }
-
- $.validator.addMethod("maxWords", function(value, element, params) {
- return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length <= params;
- }, $.validator.format("Please enter {0} words or less."));
-
- $.validator.addMethod("minWords", function(value, element, params) {
- return this.optional(element) || stripHtml(value).match(/\b\w+\b/g).length >= params;
- }, $.validator.format("Please enter at least {0} words."));
-
- $.validator.addMethod("rangeWords", function(value, element, params) {
- var valueStripped = stripHtml(value),
- regex = /\b\w+\b/g;
- return this.optional(element) || valueStripped.match(regex).length >= params[0] && valueStripped.match(regex).length <= params[1];
- }, $.validator.format("Please enter between {0} and {1} words."));
-
-}());
-
-// Accept a value from a file input based on a required mimetype
-$.validator.addMethod("accept", function(value, element, param) {
- // Split mime on commas in case we have multiple types we can accept
- var typeParam = typeof param === "string" ? param.replace(/\s/g, "").replace(/,/g, "|") : "image/*",
- optionalValue = this.optional(element),
- i, file;
-
- // Element is optional
- if (optionalValue) {
- return optionalValue;
- }
-
- if ($(element).attr("type") === "file") {
- // If we are using a wildcard, make it regex friendly
- typeParam = typeParam.replace(/\*/g, ".*");
-
- // Check if the element has a FileList before checking each file
- if (element.files && element.files.length) {
- for (i = 0; i < element.files.length; i++) {
- file = element.files[i];
-
- // Grab the mimetype from the loaded file, verify it matches
- if (!file.type.match(new RegExp( "\\.?(" + typeParam + ")$", "i"))) {
- return false;
- }
- }
- }
- }
-
- // Either return true because we've validated each file, or because the
- // browser does not support element.files and the FileList feature
- return true;
-}, $.validator.format("Please enter a value with a valid mimetype."));
-
-$.validator.addMethod("alphanumeric", function(value, element) {
- return this.optional(element) || /^\w+$/i.test(value);
-}, "Letters, numbers, and underscores only please");
-
-/*
- * Dutch bank account numbers (not 'giro' numbers) have 9 digits
- * and pass the '11 check'.
- * We accept the notation with spaces, as that is common.
- * acceptable: 123456789 or 12 34 56 789
- */
-$.validator.addMethod("bankaccountNL", function(value, element) {
- if (this.optional(element)) {
- return true;
- }
- if (!(/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(value))) {
- return false;
- }
- // now '11 check'
- var account = value.replace(/ /g, ""), // remove spaces
- sum = 0,
- len = account.length,
- pos, factor, digit;
- for ( pos = 0; pos < len; pos++ ) {
- factor = len - pos;
- digit = account.substring(pos, pos + 1);
- sum = sum + factor * digit;
- }
- return sum % 11 === 0;
-}, "Please specify a valid bank account number");
-
-$.validator.addMethod("bankorgiroaccountNL", function(value, element) {
- return this.optional(element) ||
- ($.validator.methods.bankaccountNL.call(this, value, element)) ||
- ($.validator.methods.giroaccountNL.call(this, value, element));
-}, "Please specify a valid bank or giro account number");
-
-/**
- * BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity.
- *
- * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)
- *
- * BIC definition in detail:
- * - First 4 characters - bank code (only letters)
- * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)
- * - Next 2 characters - location code (letters and digits)
- * a. shall not start with '0' or '1'
- * b. second character must be a letter ('O' is not allowed) or one of the following digits ('0' for test (therefore not allowed), '1' for passive participant and '2' for active participant)
- * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)
- */
-$.validator.addMethod("bic", function(value, element) {
- return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value );
-}, "Please specify a valid BIC code");
-
-/*
- * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities
- * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal
- */
-$.validator.addMethod( "cifES", function( value ) {
- "use strict";
-
- var num = [],
- controlDigit, sum, i, count, tmp, secondDigit;
-
- value = value.toUpperCase();
-
- // Quick format test
- if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
- return false;
- }
-
- for ( i = 0; i < 9; i++ ) {
- num[ i ] = parseInt( value.charAt( i ), 10 );
- }
-
- // Algorithm for checking CIF codes
- sum = num[ 2 ] + num[ 4 ] + num[ 6 ];
- for ( count = 1; count < 8; count += 2 ) {
- tmp = ( 2 * num[ count ] ).toString();
- secondDigit = tmp.charAt( 1 );
-
- sum += parseInt( tmp.charAt( 0 ), 10 ) + ( secondDigit === "" ? 0 : parseInt( secondDigit, 10 ) );
- }
-
- /* The first (position 1) is a letter following the following criteria:
- * A. Corporations
- * B. LLCs
- * C. General partnerships
- * D. Companies limited partnerships
- * E. Communities of goods
- * F. Cooperative Societies
- * G. Associations
- * H. Communities of homeowners in horizontal property regime
- * J. Civil Societies
- * K. Old format
- * L. Old format
- * M. Old format
- * N. Nonresident entities
- * P. Local authorities
- * Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions
- * R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)
- * S. Organs of State Administration and regions
- * V. Agrarian Transformation
- * W. Permanent establishments of non-resident in Spain
- */
- if ( /^[ABCDEFGHJNPQRSUVW]{1}/.test( value ) ) {
- sum += "";
- controlDigit = 10 - parseInt( sum.charAt( sum.length - 1 ), 10 );
- value += controlDigit;
- return ( num[ 8 ].toString() === String.fromCharCode( 64 + controlDigit ) || num[ 8 ].toString() === value.charAt( value.length - 1 ) );
- }
-
- return false;
-
-}, "Please specify a valid CIF number." );
-
-/*
- * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.
- * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.
- */
-$.validator.addMethod("cpfBR", function(value) {
- // Removing special characters from value
- value = value.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "");
-
- // Checking value to have 11 digits only
- if (value.length !== 11) {
- return false;
- }
-
- var sum = 0,
- firstCN, secondCN, checkResult, i;
-
- firstCN = parseInt(value.substring(9, 10), 10);
- secondCN = parseInt(value.substring(10, 11), 10);
-
- checkResult = function(sum, cn) {
- var result = (sum * 10) % 11;
- if ((result === 10) || (result === 11)) {result = 0;}
- return (result === cn);
- };
-
- // Checking for dump data
- if (value === "" ||
- value === "00000000000" ||
- value === "11111111111" ||
- value === "22222222222" ||
- value === "33333333333" ||
- value === "44444444444" ||
- value === "55555555555" ||
- value === "66666666666" ||
- value === "77777777777" ||
- value === "88888888888" ||
- value === "99999999999"
- ) {
- return false;
- }
-
- // Step 1 - using first Check Number:
- for ( i = 1; i <= 9; i++ ) {
- sum = sum + parseInt(value.substring(i - 1, i), 10) * (11 - i);
- }
-
- // If first Check Number (CN) is valid, move to Step 2 - using second Check Number:
- if ( checkResult(sum, firstCN) ) {
- sum = 0;
- for ( i = 1; i <= 10; i++ ) {
- sum = sum + parseInt(value.substring(i - 1, i), 10) * (12 - i);
- }
- return checkResult(sum, secondCN);
- }
- return false;
-
-}, "Please specify a valid CPF number");
-
-/* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator
- * Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
- * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)
- */
-$.validator.addMethod("creditcardtypes", function(value, element, param) {
- if (/[^0-9\-]+/.test(value)) {
- return false;
- }
-
- value = value.replace(/\D/g, "");
-
- var validTypes = 0x0000;
-
- if (param.mastercard) {
- validTypes |= 0x0001;
- }
- if (param.visa) {
- validTypes |= 0x0002;
- }
- if (param.amex) {
- validTypes |= 0x0004;
- }
- if (param.dinersclub) {
- validTypes |= 0x0008;
- }
- if (param.enroute) {
- validTypes |= 0x0010;
- }
- if (param.discover) {
- validTypes |= 0x0020;
- }
- if (param.jcb) {
- validTypes |= 0x0040;
- }
- if (param.unknown) {
- validTypes |= 0x0080;
- }
- if (param.all) {
- validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;
- }
- if (validTypes & 0x0001 && /^(5[12345])/.test(value)) { //mastercard
- return value.length === 16;
- }
- if (validTypes & 0x0002 && /^(4)/.test(value)) { //visa
- return value.length === 16;
- }
- if (validTypes & 0x0004 && /^(3[47])/.test(value)) { //amex
- return value.length === 15;
- }
- if (validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test(value)) { //dinersclub
- return value.length === 14;
- }
- if (validTypes & 0x0010 && /^(2(014|149))/.test(value)) { //enroute
- return value.length === 15;
- }
- if (validTypes & 0x0020 && /^(6011)/.test(value)) { //discover
- return value.length === 16;
- }
- if (validTypes & 0x0040 && /^(3)/.test(value)) { //jcb
- return value.length === 16;
- }
- if (validTypes & 0x0040 && /^(2131|1800)/.test(value)) { //jcb
- return value.length === 15;
- }
- if (validTypes & 0x0080) { //unknown
- return true;
- }
- return false;
-}, "Please enter a valid credit card number.");
-
-/**
- * Validates currencies with any given symbols by @jameslouiz
- * Symbols can be optional or required. Symbols required by default
- *
- * Usage examples:
- * currency: ["£", false] - Use false for soft currency validation
- * currency: ["$", false]
- * currency: ["RM", false] - also works with text based symbols such as "RM" - Malaysia Ringgit etc
- *
- * <input class="currencyInput" name="currencyInput">
- *
- * Soft symbol checking
- * currencyInput: {
- * currency: ["$", false]
- * }
- *
- * Strict symbol checking (default)
- * currencyInput: {
- * currency: "$"
- * //OR
- * currency: ["$", true]
- * }
- *
- * Multiple Symbols
- * currencyInput: {
- * currency: "$,£,¢"
- * }
- */
-$.validator.addMethod("currency", function(value, element, param) {
- var isParamString = typeof param === "string",
- symbol = isParamString ? param : param[0],
- soft = isParamString ? true : param[1],
- regex;
-
- symbol = symbol.replace(/,/g, "");
- symbol = soft ? symbol + "]" : symbol + "]?";
- regex = "^[" + symbol + "([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$";
- regex = new RegExp(regex);
- return this.optional(element) || regex.test(value);
-
-}, "Please specify a valid currency");
-
-$.validator.addMethod("dateFA", function(value, element) {
- return this.optional(element) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(value);
-}, $.validator.messages.date);
-
-/**
- * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.
- *
- * @example $.validator.methods.date("01/01/1900")
- * @result true
- *
- * @example $.validator.methods.date("01/13/1990")
- * @result false
- *
- * @example $.validator.methods.date("01.01.1900")
- * @result false
- *
- * @example <input name="pippo" class="{dateITA:true}" />
- * @desc Declares an optional input element whose value must be a valid date.
- *
- * @name $.validator.methods.dateITA
- * @type Boolean
- * @cat Plugins/Validate/Methods
- */
-$.validator.addMethod("dateITA", function(value, element) {
- var check = false,
- re = /^\d{1,2}\/\d{1,2}\/\d{4}$/,
- adata, gg, mm, aaaa, xdata;
- if ( re.test(value)) {
- adata = value.split("/");
- gg = parseInt(adata[0], 10);
- mm = parseInt(adata[1], 10);
- aaaa = parseInt(adata[2], 10);
- xdata = new Date(Date.UTC(aaaa, mm - 1, gg, 12, 0, 0, 0));
- if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth () === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {
- check = true;
- } else {
- check = false;
- }
- } else {
- check = false;
- }
- return this.optional(element) || check;
-}, $.validator.messages.date);
-
-$.validator.addMethod("dateNL", function(value, element) {
- return this.optional(element) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(value);
-}, $.validator.messages.date);
-
-// Older "accept" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept
-$.validator.addMethod("extension", function(value, element, param) {
- param = typeof param === "string" ? param.replace(/,/g, "|") : "png|jpe?g|gif";
- return this.optional(element) || value.match(new RegExp("\\.(" + param + ")$", "i"));
-}, $.validator.format("Please enter a value with a valid extension."));
-
-/**
- * Dutch giro account numbers (not bank numbers) have max 7 digits
- */
-$.validator.addMethod("giroaccountNL", function(value, element) {
- return this.optional(element) || /^[0-9]{1,7}$/.test(value);
-}, "Please specify a valid giro account number");
-
-/**
- * IBAN is the international bank account number.
- * It has a country - specific format, that is checked here too
- */
-$.validator.addMethod("iban", function(value, element) {
- // some quick simple tests to prevent needless work
- if (this.optional(element)) {
- return true;
- }
-
- // remove spaces and to upper case
- var iban = value.replace(/ /g, "").toUpperCase(),
- ibancheckdigits = "",
- leadingZeroes = true,
- cRest = "",
- cOperator = "",
- countrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;
-
- // check the country code and find the country specific format
- countrycode = iban.substring(0, 2);
- bbancountrypatterns = {
- "AL": "\\d{8}[\\dA-Z]{16}",
- "AD": "\\d{8}[\\dA-Z]{12}",
- "AT": "\\d{16}",
- "AZ": "[\\dA-Z]{4}\\d{20}",
- "BE": "\\d{12}",
- "BH": "[A-Z]{4}[\\dA-Z]{14}",
- "BA": "\\d{16}",
- "BR": "\\d{23}[A-Z][\\dA-Z]",
- "BG": "[A-Z]{4}\\d{6}[\\dA-Z]{8}",
- "CR": "\\d{17}",
- "HR": "\\d{17}",
- "CY": "\\d{8}[\\dA-Z]{16}",
- "CZ": "\\d{20}",
- "DK": "\\d{14}",
- "DO": "[A-Z]{4}\\d{20}",
- "EE": "\\d{16}",
- "FO": "\\d{14}",
- "FI": "\\d{14}",
- "FR": "\\d{10}[\\dA-Z]{11}\\d{2}",
- "GE": "[\\dA-Z]{2}\\d{16}",
- "DE": "\\d{18}",
- "GI": "[A-Z]{4}[\\dA-Z]{15}",
- "GR": "\\d{7}[\\dA-Z]{16}",
- "GL": "\\d{14}",
- "GT": "[\\dA-Z]{4}[\\dA-Z]{20}",
- "HU": "\\d{24}",
- "IS": "\\d{22}",
- "IE": "[\\dA-Z]{4}\\d{14}",
- "IL": "\\d{19}",
- "IT": "[A-Z]\\d{10}[\\dA-Z]{12}",
- "KZ": "\\d{3}[\\dA-Z]{13}",
- "KW": "[A-Z]{4}[\\dA-Z]{22}",
- "LV": "[A-Z]{4}[\\dA-Z]{13}",
- "LB": "\\d{4}[\\dA-Z]{20}",
- "LI": "\\d{5}[\\dA-Z]{12}",
- "LT": "\\d{16}",
- "LU": "\\d{3}[\\dA-Z]{13}",
- "MK": "\\d{3}[\\dA-Z]{10}\\d{2}",
- "MT": "[A-Z]{4}\\d{5}[\\dA-Z]{18}",
- "MR": "\\d{23}",
- "MU": "[A-Z]{4}\\d{19}[A-Z]{3}",
- "MC": "\\d{10}[\\dA-Z]{11}\\d{2}",
- "MD": "[\\dA-Z]{2}\\d{18}",
- "ME": "\\d{18}",
- "NL": "[A-Z]{4}\\d{10}",
- "NO": "\\d{11}",
- "PK": "[\\dA-Z]{4}\\d{16}",
- "PS": "[\\dA-Z]{4}\\d{21}",
- "PL": "\\d{24}",
- "PT": "\\d{21}",
- "RO": "[A-Z]{4}[\\dA-Z]{16}",
- "SM": "[A-Z]\\d{10}[\\dA-Z]{12}",
- "SA": "\\d{2}[\\dA-Z]{18}",
- "RS": "\\d{18}",
- "SK": "\\d{20}",
- "SI": "\\d{15}",
- "ES": "\\d{20}",
- "SE": "\\d{20}",
- "CH": "\\d{5}[\\dA-Z]{12}",
- "TN": "\\d{20}",
- "TR": "\\d{5}[\\dA-Z]{17}",
- "AE": "\\d{3}\\d{16}",
- "GB": "[A-Z]{4}\\d{14}",
- "VG": "[\\dA-Z]{4}\\d{16}"
- };
-
- bbanpattern = bbancountrypatterns[countrycode];
- // As new countries will start using IBAN in the
- // future, we only check if the countrycode is known.
- // This prevents false negatives, while almost all
- // false positives introduced by this, will be caught
- // by the checksum validation below anyway.
- // Strict checking should return FALSE for unknown
- // countries.
- if (typeof bbanpattern !== "undefined") {
- ibanregexp = new RegExp("^[A-Z]{2}\\d{2}" + bbanpattern + "$", "");
- if (!(ibanregexp.test(iban))) {
- return false; // invalid country specific format
- }
- }
-
- // now check the checksum, first convert to digits
- ibancheck = iban.substring(4, iban.length) + iban.substring(0, 4);
- for (i = 0; i < ibancheck.length; i++) {
- charAt = ibancheck.charAt(i);
- if (charAt !== "0") {
- leadingZeroes = false;
- }
- if (!leadingZeroes) {
- ibancheckdigits += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(charAt);
- }
- }
-
- // calculate the result of: ibancheckdigits % 97
- for (p = 0; p < ibancheckdigits.length; p++) {
- cChar = ibancheckdigits.charAt(p);
- cOperator = "" + cRest + "" + cChar;
- cRest = cOperator % 97;
- }
- return cRest === 1;
-}, "Please specify a valid IBAN");
-
-$.validator.addMethod("integer", function(value, element) {
- return this.optional(element) || /^-?\d+$/.test(value);
-}, "A positive or negative non-decimal number please");
-
-$.validator.addMethod("ipv4", function(value, element) {
- return this.optional(element) || /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(value);
-}, "Please enter a valid IP v4 address.");
-
-$.validator.addMethod("ipv6", function(value, element) {
- return this.optional(element) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(value);
-}, "Please enter a valid IP v6 address.");
-
-$.validator.addMethod("lettersonly", function(value, element) {
- return this.optional(element) || /^[a-z]+$/i.test(value);
-}, "Letters only please");
-
-$.validator.addMethod("letterswithbasicpunc", function(value, element) {
- return this.optional(element) || /^[a-z\-.,()'"\s]+$/i.test(value);
-}, "Letters or punctuation only please");
-
-$.validator.addMethod("mobileNL", function(value, element) {
- return this.optional(element) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(value);
-}, "Please specify a valid mobile number");
-
-/* For UK phone functions, do the following server side processing:
- * Compare original input with this RegEx pattern:
- * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
- * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
- * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
- * A number of very detailed GB telephone number RegEx patterns can also be found at:
- * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
- */
-$.validator.addMethod("mobileUK", function(phone_number, element) {
- phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
- return this.optional(element) || phone_number.length > 9 &&
- phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/);
-}, "Please specify a valid mobile number");
-
-/*
- * The número de identidad de extranjero ( NIE )is a code used to identify the non-nationals in Spain
- */
-$.validator.addMethod( "nieES", function( value ) {
- "use strict";
-
- value = value.toUpperCase();
-
- // Basic format test
- if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
- return false;
- }
-
- // Test NIE
- //T
- if ( /^[T]{1}/.test( value ) ) {
- return ( value[ 8 ] === /^[T]{1}[A-Z0-9]{8}$/.test( value ) );
- }
-
- //XYZ
- if ( /^[XYZ]{1}/.test( value ) ) {
- return (
- value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt(
- value.replace( "X", "0" )
- .replace( "Y", "1" )
- .replace( "Z", "2" )
- .substring( 0, 8 ) % 23
- )
- );
- }
-
- return false;
-
-}, "Please specify a valid NIE number." );
-
-/*
- * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals
- */
-$.validator.addMethod( "nifES", function( value ) {
- "use strict";
-
- value = value.toUpperCase();
-
- // Basic format test
- if ( !value.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)") ) {
- return false;
- }
-
- // Test NIF
- if ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {
- return ( "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );
- }
- // Test specials NIF (starts with K, L or M)
- if ( /^[KLM]{1}/.test( value ) ) {
- return ( value[ 8 ] === String.fromCharCode( 64 ) );
- }
-
- return false;
-
-}, "Please specify a valid NIF number." );
-
-jQuery.validator.addMethod( "notEqualTo", function( value, element, param ) {
- return this.optional(element) || !$.validator.methods.equalTo.call( this, value, element, param );
-}, "Please enter a different value, values must not be the same." );
-
-$.validator.addMethod("nowhitespace", function(value, element) {
- return this.optional(element) || /^\S+$/i.test(value);
-}, "No white space please");
-
-/**
-* Return true if the field value matches the given format RegExp
-*
-* @example $.validator.methods.pattern("AR1004",element,/^AR\d{4}$/)
-* @result true
-*
-* @example $.validator.methods.pattern("BR1004",element,/^AR\d{4}$/)
-* @result false
-*
-* @name $.validator.methods.pattern
-* @type Boolean
-* @cat Plugins/Validate/Methods
-*/
-$.validator.addMethod("pattern", function(value, element, param) {
- if (this.optional(element)) {
- return true;
- }
- if (typeof param === "string") {
- param = new RegExp("^(?:" + param + ")$");
- }
- return param.test(value);
-}, "Invalid format.");
-
-/**
- * Dutch phone numbers have 10 digits (or 11 and start with +31).
- */
-$.validator.addMethod("phoneNL", function(value, element) {
- return this.optional(element) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(value);
-}, "Please specify a valid phone number.");
-
-/* For UK phone functions, do the following server side processing:
- * Compare original input with this RegEx pattern:
- * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
- * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
- * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
- * A number of very detailed GB telephone number RegEx patterns can also be found at:
- * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
- */
-$.validator.addMethod("phoneUK", function(phone_number, element) {
- phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
- return this.optional(element) || phone_number.length > 9 &&
- phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/);
-}, "Please specify a valid phone number");
-
-/**
- * matches US phone number format
- *
- * where the area code may not start with 1 and the prefix may not start with 1
- * allows '-' or ' ' as a separator and allows parens around area code
- * some people may want to put a '1' in front of their number
- *
- * 1(212)-999-2345 or
- * 212 999 2344 or
- * 212-999-0983
- *
- * but not
- * 111-123-5434
- * and not
- * 212 123 4567
- */
-$.validator.addMethod("phoneUS", function(phone_number, element) {
- phone_number = phone_number.replace(/\s+/g, "");
- return this.optional(element) || phone_number.length > 9 &&
- phone_number.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/);
-}, "Please specify a valid phone number");
-
-/* For UK phone functions, do the following server side processing:
- * Compare original input with this RegEx pattern:
- * ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
- * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
- * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
- * A number of very detailed GB telephone number RegEx patterns can also be found at:
- * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
- */
-//Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
-$.validator.addMethod("phonesUK", function(phone_number, element) {
- phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
- return this.optional(element) || phone_number.length > 9 &&
- phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/);
-}, "Please specify a valid uk phone number");
-
-/**
- * Matches a valid Canadian Postal Code
- *
- * @example jQuery.validator.methods.postalCodeCA( "H0H 0H0", element )
- * @result true
- *
- * @example jQuery.validator.methods.postalCodeCA( "H0H0H0", element )
- * @result false
- *
- * @name jQuery.validator.methods.postalCodeCA
- * @type Boolean
- * @cat Plugins/Validate/Methods
- */
-$.validator.addMethod( "postalCodeCA", function( value, element ) {
- return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/.test( value );
-}, "Please specify a valid postal code" );
-
-/*
-* Valida CEPs do brasileiros:
-*
-* Formatos aceitos:
-* 99999-999
-* 99.999-999
-* 99999999
-*/
-$.validator.addMethod("postalcodeBR", function(cep_value, element) {
- return this.optional(element) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value );
-}, "Informe um CEP válido.");
-
-/* Matches Italian postcode (CAP) */
-$.validator.addMethod("postalcodeIT", function(value, element) {
- return this.optional(element) || /^\d{5}$/.test(value);
-}, "Please specify a valid postal code");
-
-$.validator.addMethod("postalcodeNL", function(value, element) {
- return this.optional(element) || /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(value);
-}, "Please specify a valid postal code");
-
-// Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)
-$.validator.addMethod("postcodeUK", function(value, element) {
- return this.optional(element) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(value);
-}, "Please specify a valid UK postcode");
-
-/*
- * Lets you say "at least X inputs that match selector Y must be filled."
- *
- * The end result is that neither of these inputs:
- *
- * <input class="productinfo" name="partnumber">
- * <input class="productinfo" name="description">
- *
- * ...will validate unless at least one of them is filled.
- *
- * partnumber: {require_from_group: [1,".productinfo"]},
- * description: {require_from_group: [1,".productinfo"]}
- *
- * options[0]: number of fields that must be filled in the group
- * options[1]: CSS selector that defines the group of conditionally required fields
- */
-$.validator.addMethod("require_from_group", function(value, element, options) {
- var $fields = $(options[1], element.form),
- $fieldsFirst = $fields.eq(0),
- validator = $fieldsFirst.data("valid_req_grp") ? $fieldsFirst.data("valid_req_grp") : $.extend({}, this),
- isValid = $fields.filter(function() {
- return validator.elementValue(this);
- }).length >= options[0];
-
- // Store the cloned validator for future validation
- $fieldsFirst.data("valid_req_grp", validator);
-
- // If element isn't being validated, run each require_from_group field's validation rules
- if (!$(element).data("being_validated")) {
- $fields.data("being_validated", true);
- $fields.each(function() {
- validator.element(this);
- });
- $fields.data("being_validated", false);
- }
- return isValid;
-}, $.validator.format("Please fill at least {0} of these fields."));
-
-/*
- * Lets you say "either at least X inputs that match selector Y must be filled,
- * OR they must all be skipped (left blank)."
- *
- * The end result, is that none of these inputs:
- *
- * <input class="productinfo" name="partnumber">
- * <input class="productinfo" name="description">
- * <input class="productinfo" name="color">
- *
- * ...will validate unless either at least two of them are filled,
- * OR none of them are.
- *
- * partnumber: {skip_or_fill_minimum: [2,".productinfo"]},
- * description: {skip_or_fill_minimum: [2,".productinfo"]},
- * color: {skip_or_fill_minimum: [2,".productinfo"]}
- *
- * options[0]: number of fields that must be filled in the group
- * options[1]: CSS selector that defines the group of conditionally required fields
- *
- */
-$.validator.addMethod("skip_or_fill_minimum", function(value, element, options) {
- var $fields = $(options[1], element.form),
- $fieldsFirst = $fields.eq(0),
- validator = $fieldsFirst.data("valid_skip") ? $fieldsFirst.data("valid_skip") : $.extend({}, this),
- numberFilled = $fields.filter(function() {
- return validator.elementValue(this);
- }).length,
- isValid = numberFilled === 0 || numberFilled >= options[0];
-
- // Store the cloned validator for future validation
- $fieldsFirst.data("valid_skip", validator);
-
- // If element isn't being validated, run each skip_or_fill_minimum field's validation rules
- if (!$(element).data("being_validated")) {
- $fields.data("being_validated", true);
- $fields.each(function() {
- validator.element(this);
- });
- $fields.data("being_validated", false);
- }
- return isValid;
-}, $.validator.format("Please either skip these fields or fill at least {0} of them."));
-
-/* Validates US States and/or Territories by @jdforsythe
- * Can be case insensitive or require capitalization - default is case insensitive
- * Can include US Territories or not - default does not
- * Can include US Military postal abbreviations (AA, AE, AP) - default does not
- *
- * Note: "States" always includes DC (District of Colombia)
- *
- * Usage examples:
- *
- * This is the default - case insensitive, no territories, no military zones
- * stateInput: {
- * caseSensitive: false,
- * includeTerritories: false,
- * includeMilitary: false
- * }
- *
- * Only allow capital letters, no territories, no military zones
- * stateInput: {
- * caseSensitive: false
- * }
- *
- * Case insensitive, include territories but not military zones
- * stateInput: {
- * includeTerritories: true
- * }
- *
- * Only allow capital letters, include territories and military zones
- * stateInput: {
- * caseSensitive: true,
- * includeTerritories: true,
- * includeMilitary: true
- * }
- *
- *
- *
- */
-
-$.validator.addMethod("stateUS", function(value, element, options) {
- var isDefault = typeof options === "undefined",
- caseSensitive = ( isDefault || typeof options.caseSensitive === "undefined" ) ? false : options.caseSensitive,
- includeTerritories = ( isDefault || typeof options.includeTerritories === "undefined" ) ? false : options.includeTerritories,
- includeMilitary = ( isDefault || typeof options.includeMilitary === "undefined" ) ? false : options.includeMilitary,
- regex;
-
- if (!includeTerritories && !includeMilitary) {
- regex = "^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
- } else if (includeTerritories && includeMilitary) {
- regex = "^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
- } else if (includeTerritories) {
- regex = "^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$";
- } else {
- regex = "^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$";
- }
-
- regex = caseSensitive ? new RegExp(regex) : new RegExp(regex, "i");
- return this.optional(element) || regex.test(value);
-},
-"Please specify a valid state");
-
-// TODO check if value starts with <, otherwise don't try stripping anything
-$.validator.addMethod("strippedminlength", function(value, element, param) {
- return $(value).text().length >= param;
-}, $.validator.format("Please enter at least {0} characters"));
-
-$.validator.addMethod("time", function(value, element) {
- return this.optional(element) || /^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test(value);
-}, "Please enter a valid time, between 00:00 and 23:59");
-
-$.validator.addMethod("time12h", function(value, element) {
- return this.optional(element) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(value);
-}, "Please enter a valid time in 12-hour am/pm format");
-
-// same as url, but TLD is optional
-$.validator.addMethod("url2", function(value, element) {
- return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
-}, $.validator.messages.url);
-
-/**
- * Return true, if the value is a valid vehicle identification number (VIN).
- *
- * Works with all kind of text inputs.
- *
- * @example <input type="text" size="20" name="VehicleID" class="{required:true,vinUS:true}" />
- * @desc Declares a required input element whose value must be a valid vehicle identification number.
- *
- * @name $.validator.methods.vinUS
- * @type Boolean
- * @cat Plugins/Validate/Methods
- */
-$.validator.addMethod("vinUS", function(v) {
- if (v.length !== 17) {
- return false;
- }
-
- var LL = [ "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ],
- VL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ],
- FL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ],
- rs = 0,
- i, n, d, f, cd, cdv;
-
- for (i = 0; i < 17; i++) {
- f = FL[i];
- d = v.slice(i, i + 1);
- if (i === 8) {
- cdv = d;
- }
- if (!isNaN(d)) {
- d *= f;
- } else {
- for (n = 0; n < LL.length; n++) {
- if (d.toUpperCase() === LL[n]) {
- d = VL[n];
- d *= f;
- if (isNaN(cdv) && n === 8) {
- cdv = LL[n];
- }
- break;
- }
- }
- }
- rs += d;
- }
- cd = rs % 11;
- if (cd === 10) {
- cd = "X";
- }
- if (cd === cdv) {
- return true;
- }
- return false;
-}, "The specified vehicle identification number (VIN) is invalid.");
-
-$.validator.addMethod("zipcodeUS", function(value, element) {
- return this.optional(element) || /^\d{5}(-\d{4})?$/.test(value);
-}, "The specified US ZIP Code is invalid");
-
-$.validator.addMethod("ziprange", function(value, element) {
- return this.optional(element) || /^90[2-5]\d\{2\}-\d{4}$/.test(value);
-}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx");
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/additional-methods.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/additional-methods.min.js
deleted file mode 100644
index b63c3ca1..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/additional-methods.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):a(jQuery)}(function(a){!function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/&nbsp;|&#160;/gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("accept",function(b,c,d){var e,f,g="string"==typeof d?d.replace(/\s/g,"").replace(/,/g,"|"):"image/*",h=this.optional(c);if(h)return h;if("file"===a(c).attr("type")&&(g=g.replace(/\*/g,".*"),c.files&&c.files.length))for(e=0;e<c.files.length;e++)if(f=c.files[e],!f.type.match(new RegExp("\\.?("+g+")$","i")))return!1;return!0},a.validator.format("Please enter a value with a valid mimetype.")),a.validator.addMethod("alphanumeric",function(a,b){return this.optional(b)||/^\w+$/i.test(a)},"Letters, numbers, and underscores only please"),a.validator.addMethod("bankaccountNL",function(a,b){if(this.optional(b))return!0;if(!/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(a))return!1;var c,d,e,f=a.replace(/ /g,""),g=0,h=f.length;for(c=0;h>c;c++)d=h-c,e=f.substring(c,c+1),g+=d*e;return g%11===0},"Please specify a valid bank account number"),a.validator.addMethod("bankorgiroaccountNL",function(b,c){return this.optional(c)||a.validator.methods.bankaccountNL.call(this,b,c)||a.validator.methods.giroaccountNL.call(this,b,c)},"Please specify a valid bank or giro account number"),a.validator.addMethod("bic",function(a,b){return this.optional(b)||/^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test(a)},"Please specify a valid BIC code"),a.validator.addMethod("cifES",function(a){"use strict";var b,c,d,e,f,g,h=[];if(a=a.toUpperCase(),!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)"))return!1;for(d=0;9>d;d++)h[d]=parseInt(a.charAt(d),10);for(c=h[2]+h[4]+h[6],e=1;8>e;e+=2)f=(2*h[e]).toString(),g=f.charAt(1),c+=parseInt(f.charAt(0),10)+(""===g?0:parseInt(g,10));return/^[ABCDEFGHJNPQRSUVW]{1}/.test(a)?(c+="",b=10-parseInt(c.charAt(c.length-1),10),a+=b,h[8].toString()===String.fromCharCode(64+b)||h[8].toString()===a.charAt(a.length-1)):!1},"Please specify a valid CIF number."),a.validator.addMethod("cpfBR",function(a){if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;var b,c,d,e,f=0;if(b=parseInt(a.substring(9,10),10),c=parseInt(a.substring(10,11),10),d=function(a,b){var c=10*a%11;return(10===c||11===c)&&(c=0),c===b},""===a||"00000000000"===a||"11111111111"===a||"22222222222"===a||"33333333333"===a||"44444444444"===a||"55555555555"===a||"66666666666"===a||"77777777777"===a||"88888888888"===a||"99999999999"===a)return!1;for(e=1;9>=e;e++)f+=parseInt(a.substring(e-1,e),10)*(11-e);if(d(f,b)){for(f=0,e=1;10>=e;e++)f+=parseInt(a.substring(e-1,e),10)*(12-e);return d(f,c)}return!1},"Please specify a valid CPF number"),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&/^(5[12345])/.test(a)?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:128&d?!0:!1},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=e?!0:c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency"),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},a.validator.messages.date),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(Date.UTC(f,e-1,d,12,0,0,0)),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d?!0:!1):h=!1,this.optional(b)||h},a.validator.messages.date),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},a.validator.messages.date),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp("\\.("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number"),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="";if(c=l.substring(0,2),h={AL:"\\d{8}[\\dA-Z]{16}",AD:"\\d{8}[\\dA-Z]{12}",AT:"\\d{16}",AZ:"[\\dA-Z]{4}\\d{20}",BE:"\\d{12}",BH:"[A-Z]{4}[\\dA-Z]{14}",BA:"\\d{16}",BR:"\\d{23}[A-Z][\\dA-Z]",BG:"[A-Z]{4}\\d{6}[\\dA-Z]{8}",CR:"\\d{17}",HR:"\\d{17}",CY:"\\d{8}[\\dA-Z]{16}",CZ:"\\d{20}",DK:"\\d{14}",DO:"[A-Z]{4}\\d{20}",EE:"\\d{16}",FO:"\\d{14}",FI:"\\d{14}",FR:"\\d{10}[\\dA-Z]{11}\\d{2}",GE:"[\\dA-Z]{2}\\d{16}",DE:"\\d{18}",GI:"[A-Z]{4}[\\dA-Z]{15}",GR:"\\d{7}[\\dA-Z]{16}",GL:"\\d{14}",GT:"[\\dA-Z]{4}[\\dA-Z]{20}",HU:"\\d{24}",IS:"\\d{22}",IE:"[\\dA-Z]{4}\\d{14}",IL:"\\d{19}",IT:"[A-Z]\\d{10}[\\dA-Z]{12}",KZ:"\\d{3}[\\dA-Z]{13}",KW:"[A-Z]{4}[\\dA-Z]{22}",LV:"[A-Z]{4}[\\dA-Z]{13}",LB:"\\d{4}[\\dA-Z]{20}",LI:"\\d{5}[\\dA-Z]{12}",LT:"\\d{16}",LU:"\\d{3}[\\dA-Z]{13}",MK:"\\d{3}[\\dA-Z]{10}\\d{2}",MT:"[A-Z]{4}\\d{5}[\\dA-Z]{18}",MR:"\\d{23}",MU:"[A-Z]{4}\\d{19}[A-Z]{3}",MC:"\\d{10}[\\dA-Z]{11}\\d{2}",MD:"[\\dA-Z]{2}\\d{18}",ME:"\\d{18}",NL:"[A-Z]{4}\\d{10}",NO:"\\d{11}",PK:"[\\dA-Z]{4}\\d{16}",PS:"[\\dA-Z]{4}\\d{21}",PL:"\\d{24}",PT:"\\d{21}",RO:"[A-Z]{4}[\\dA-Z]{16}",SM:"[A-Z]\\d{10}[\\dA-Z]{12}",SA:"\\d{2}[\\dA-Z]{18}",RS:"\\d{18}",SK:"\\d{20}",SI:"\\d{15}",ES:"\\d{20}",SE:"\\d{20}",CH:"\\d{5}[\\dA-Z]{12}",TN:"\\d{20}",TR:"\\d{5}[\\dA-Z]{17}",AE:"\\d{3}\\d{16}",GB:"[A-Z]{4}\\d{14}",VG:"[\\dA-Z]{4}\\d{16}"},g=h[c],"undefined"!=typeof g&&(i=new RegExp("^[A-Z]{2}\\d{2}"+g+"$",""),!i.test(l)))return!1;for(d=l.substring(4,l.length)+l.substring(0,4),j=0;j<d.length;j++)e=d.charAt(j),"0"!==e&&(n=!1),n||(m+="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(e));for(k=0;k<m.length;k++)f=m.charAt(k),p=""+o+f,o=p%97;return 1===o},"Please specify a valid IBAN"),a.validator.addMethod("integer",function(a,b){return this.optional(b)||/^-?\d+$/.test(a)},"A positive or negative non-decimal number please"),a.validator.addMethod("ipv4",function(a,b){return this.optional(b)||/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(a)},"Please enter a valid IP v4 address."),a.validator.addMethod("ipv6",function(a,b){return this.optional(b)||/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(a)},"Please enter a valid IP v6 address."),a.validator.addMethod("lettersonly",function(a,b){return this.optional(b)||/^[a-z]+$/i.test(a)},"Letters only please"),a.validator.addMethod("letterswithbasicpunc",function(a,b){return this.optional(b)||/^[a-z\-.,()'"\s]+$/i.test(a)},"Letters or punctuation only please"),a.validator.addMethod("mobileNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid mobile number"),a.validator.addMethod("mobileUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),a.validator.addMethod("nieES",function(a){"use strict";return a=a.toUpperCase(),a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")?/^[T]{1}/.test(a)?a[8]===/^[T]{1}[A-Z0-9]{8}$/.test(a):/^[XYZ]{1}/.test(a)?a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.replace("X","0").replace("Y","1").replace("Z","2").substring(0,8)%23):!1:!1},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a){"use strict";return a=a.toUpperCase(),a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")?/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):/^[KLM]{1}/.test(a)?a[8]===String.fromCharCode(64):!1:!1},"Please specify a valid NIF number."),jQuery.validator.addMethod("notEqualTo",function(b,c,d){return this.optional(c)||!a.validator.methods.equalTo.call(this,b,c,d)},"Please enter a different value, values must not be the same."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please"),a.validator.addMethod("pattern",function(a,b,c){return this.optional(b)?!0:("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/)},"Please specify a valid phone number"),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode"),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),a.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=e||"undefined"==typeof c.caseSensitive?!1:c.caseSensitive,g=e||"undefined"==typeof c.includeTerritories?!1:c.includeTerritories,h=e||"undefined"==typeof c.includeMilitary?!1:c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state"),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59"),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format"),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;17>b;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c<h.length;c++)if(d.toUpperCase()===h[c]){d=i[c],d*=e,isNaN(g)&&8===c&&(g=h[c]);break}}else d*=e;k+=d}return f=k%11,10===f&&(f="X"),f===g?!0:!1},"The specified vehicle identification number (VIN) is invalid."),a.validator.addMethod("zipcodeUS",function(a,b){return this.optional(b)||/^\d{5}(-\d{4})?$/.test(a)},"The specified US ZIP Code is invalid"),a.validator.addMethod("ziprange",function(a,b){return this.optional(b)||/^90[2-5]\d\{2\}-\d{4}$/.test(a)},"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx")}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/jquery.validate.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/jquery.validate.js
deleted file mode 100644
index 4e979bcf..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/jquery.validate.js
+++ /dev/null
@@ -1,1398 +0,0 @@
-/*!
- * jQuery Validation Plugin v1.14.0
- *
- * http://jqueryvalidation.org/
- *
- * Copyright (c) 2015 Jörn Zaefferer
- * Released under the MIT license
- */
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-$.extend($.fn, {
- // http://jqueryvalidation.org/validate/
- validate: function( options ) {
-
- // if nothing is selected, return nothing; can't chain anyway
- if ( !this.length ) {
- if ( options && options.debug && window.console ) {
- console.warn( "Nothing selected, can't validate, returning nothing." );
- }
- return;
- }
-
- // check if a validator for this form was already created
- var validator = $.data( this[ 0 ], "validator" );
- if ( validator ) {
- return validator;
- }
-
- // Add novalidate tag if HTML5.
- this.attr( "novalidate", "novalidate" );
-
- validator = new $.validator( options, this[ 0 ] );
- $.data( this[ 0 ], "validator", validator );
-
- if ( validator.settings.onsubmit ) {
-
- this.on( "click.validate", ":submit", function( event ) {
- if ( validator.settings.submitHandler ) {
- validator.submitButton = event.target;
- }
-
- // allow suppressing validation by adding a cancel class to the submit button
- if ( $( this ).hasClass( "cancel" ) ) {
- validator.cancelSubmit = true;
- }
-
- // allow suppressing validation by adding the html5 formnovalidate attribute to the submit button
- if ( $( this ).attr( "formnovalidate" ) !== undefined ) {
- validator.cancelSubmit = true;
- }
- });
-
- // validate the form on submit
- this.on( "submit.validate", function( event ) {
- if ( validator.settings.debug ) {
- // prevent form submit to be able to see console output
- event.preventDefault();
- }
- function handle() {
- var hidden, result;
- if ( validator.settings.submitHandler ) {
- if ( validator.submitButton ) {
- // insert a hidden input as a replacement for the missing submit button
- hidden = $( "<input type='hidden'/>" )
- .attr( "name", validator.submitButton.name )
- .val( $( validator.submitButton ).val() )
- .appendTo( validator.currentForm );
- }
- result = validator.settings.submitHandler.call( validator, validator.currentForm, event );
- if ( validator.submitButton ) {
- // and clean up afterwards; thanks to no-block-scope, hidden can be referenced
- hidden.remove();
- }
- if ( result !== undefined ) {
- return result;
- }
- return false;
- }
- return true;
- }
-
- // prevent submit for invalid forms or custom submit handlers
- if ( validator.cancelSubmit ) {
- validator.cancelSubmit = false;
- return handle();
- }
- if ( validator.form() ) {
- if ( validator.pendingRequest ) {
- validator.formSubmitted = true;
- return false;
- }
- return handle();
- } else {
- validator.focusInvalid();
- return false;
- }
- });
- }
-
- return validator;
- },
- // http://jqueryvalidation.org/valid/
- valid: function() {
- var valid, validator, errorList;
-
- if ( $( this[ 0 ] ).is( "form" ) ) {
- valid = this.validate().form();
- } else {
- errorList = [];
- valid = true;
- validator = $( this[ 0 ].form ).validate();
- this.each( function() {
- valid = validator.element( this ) && valid;
- errorList = errorList.concat( validator.errorList );
- });
- validator.errorList = errorList;
- }
- return valid;
- },
-
- // http://jqueryvalidation.org/rules/
- rules: function( command, argument ) {
- var element = this[ 0 ],
- settings, staticRules, existingRules, data, param, filtered;
-
- if ( command ) {
- settings = $.data( element.form, "validator" ).settings;
- staticRules = settings.rules;
- existingRules = $.validator.staticRules( element );
- switch ( command ) {
- case "add":
- $.extend( existingRules, $.validator.normalizeRule( argument ) );
- // remove messages from rules, but allow them to be set separately
- delete existingRules.messages;
- staticRules[ element.name ] = existingRules;
- if ( argument.messages ) {
- settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );
- }
- break;
- case "remove":
- if ( !argument ) {
- delete staticRules[ element.name ];
- return existingRules;
- }
- filtered = {};
- $.each( argument.split( /\s/ ), function( index, method ) {
- filtered[ method ] = existingRules[ method ];
- delete existingRules[ method ];
- if ( method === "required" ) {
- $( element ).removeAttr( "aria-required" );
- }
- });
- return filtered;
- }
- }
-
- data = $.validator.normalizeRules(
- $.extend(
- {},
- $.validator.classRules( element ),
- $.validator.attributeRules( element ),
- $.validator.dataRules( element ),
- $.validator.staticRules( element )
- ), element );
-
- // make sure required is at front
- if ( data.required ) {
- param = data.required;
- delete data.required;
- data = $.extend( { required: param }, data );
- $( element ).attr( "aria-required", "true" );
- }
-
- // make sure remote is at back
- if ( data.remote ) {
- param = data.remote;
- delete data.remote;
- data = $.extend( data, { remote: param });
- }
-
- return data;
- }
-});
-
-// Custom selectors
-$.extend( $.expr[ ":" ], {
- // http://jqueryvalidation.org/blank-selector/
- blank: function( a ) {
- return !$.trim( "" + $( a ).val() );
- },
- // http://jqueryvalidation.org/filled-selector/
- filled: function( a ) {
- return !!$.trim( "" + $( a ).val() );
- },
- // http://jqueryvalidation.org/unchecked-selector/
- unchecked: function( a ) {
- return !$( a ).prop( "checked" );
- }
-});
-
-// constructor for validator
-$.validator = function( options, form ) {
- this.settings = $.extend( true, {}, $.validator.defaults, options );
- this.currentForm = form;
- this.init();
-};
-
-// http://jqueryvalidation.org/jQuery.validator.format/
-$.validator.format = function( source, params ) {
- if ( arguments.length === 1 ) {
- return function() {
- var args = $.makeArray( arguments );
- args.unshift( source );
- return $.validator.format.apply( this, args );
- };
- }
- if ( arguments.length > 2 && params.constructor !== Array ) {
- params = $.makeArray( arguments ).slice( 1 );
- }
- if ( params.constructor !== Array ) {
- params = [ params ];
- }
- $.each( params, function( i, n ) {
- source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() {
- return n;
- });
- });
- return source;
-};
-
-$.extend( $.validator, {
-
- defaults: {
- messages: {},
- groups: {},
- rules: {},
- errorClass: "error",
- validClass: "valid",
- errorElement: "label",
- focusCleanup: false,
- focusInvalid: true,
- errorContainer: $( [] ),
- errorLabelContainer: $( [] ),
- onsubmit: true,
- ignore: ":hidden",
- ignoreTitle: false,
- onfocusin: function( element ) {
- this.lastActive = element;
-
- // Hide error label and remove error class on focus if enabled
- if ( this.settings.focusCleanup ) {
- if ( this.settings.unhighlight ) {
- this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );
- }
- this.hideThese( this.errorsFor( element ) );
- }
- },
- onfocusout: function( element ) {
- if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {
- this.element( element );
- }
- },
- onkeyup: function( element, event ) {
- // Avoid revalidate the field when pressing one of the following keys
- // Shift => 16
- // Ctrl => 17
- // Alt => 18
- // Caps lock => 20
- // End => 35
- // Home => 36
- // Left arrow => 37
- // Up arrow => 38
- // Right arrow => 39
- // Down arrow => 40
- // Insert => 45
- // Num lock => 144
- // AltGr key => 225
- var excludedKeys = [
- 16, 17, 18, 20, 35, 36, 37,
- 38, 39, 40, 45, 144, 225
- ];
-
- if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {
- return;
- } else if ( element.name in this.submitted || element === this.lastElement ) {
- this.element( element );
- }
- },
- onclick: function( element ) {
- // click on selects, radiobuttons and checkboxes
- if ( element.name in this.submitted ) {
- this.element( element );
-
- // or option elements, check parent select in that case
- } else if ( element.parentNode.name in this.submitted ) {
- this.element( element.parentNode );
- }
- },
- highlight: function( element, errorClass, validClass ) {
- if ( element.type === "radio" ) {
- this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
- } else {
- $( element ).addClass( errorClass ).removeClass( validClass );
- }
- },
- unhighlight: function( element, errorClass, validClass ) {
- if ( element.type === "radio" ) {
- this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
- } else {
- $( element ).removeClass( errorClass ).addClass( validClass );
- }
- }
- },
-
- // http://jqueryvalidation.org/jQuery.validator.setDefaults/
- setDefaults: function( settings ) {
- $.extend( $.validator.defaults, settings );
- },
-
- messages: {
- required: "This field is required.",
- remote: "Please fix this field.",
- email: "Please enter a valid email address.",
- url: "Please enter a valid URL.",
- date: "Please enter a valid date.",
- dateISO: "Please enter a valid date ( ISO ).",
- number: "Please enter a valid number.",
- digits: "Please enter only digits.",
- creditcard: "Please enter a valid credit card number.",
- equalTo: "Please enter the same value again.",
- maxlength: $.validator.format( "Please enter no more than {0} characters." ),
- minlength: $.validator.format( "Please enter at least {0} characters." ),
- rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
- range: $.validator.format( "Please enter a value between {0} and {1}." ),
- max: $.validator.format( "Please enter a value less than or equal to {0}." ),
- min: $.validator.format( "Please enter a value greater than or equal to {0}." )
- },
-
- autoCreateRanges: false,
-
- prototype: {
-
- init: function() {
- this.labelContainer = $( this.settings.errorLabelContainer );
- this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );
- this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );
- this.submitted = {};
- this.valueCache = {};
- this.pendingRequest = 0;
- this.pending = {};
- this.invalid = {};
- this.reset();
-
- var groups = ( this.groups = {} ),
- rules;
- $.each( this.settings.groups, function( key, value ) {
- if ( typeof value === "string" ) {
- value = value.split( /\s/ );
- }
- $.each( value, function( index, name ) {
- groups[ name ] = key;
- });
- });
- rules = this.settings.rules;
- $.each( rules, function( key, value ) {
- rules[ key ] = $.validator.normalizeRule( value );
- });
-
- function delegate( event ) {
- var validator = $.data( this.form, "validator" ),
- eventType = "on" + event.type.replace( /^validate/, "" ),
- settings = validator.settings;
- if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {
- settings[ eventType ].call( validator, this, event );
- }
- }
-
- $( this.currentForm )
- .on( "focusin.validate focusout.validate keyup.validate",
- ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " +
- "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " +
- "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " +
- "[type='radio'], [type='checkbox']", delegate)
- // Support: Chrome, oldIE
- // "select" is provided as event.target when clicking a option
- .on("click.validate", "select, option, [type='radio'], [type='checkbox']", delegate);
-
- if ( this.settings.invalidHandler ) {
- $( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler );
- }
-
- // Add aria-required to any Static/Data/Class required fields before first validation
- // Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html
- $( this.currentForm ).find( "[required], [data-rule-required], .required" ).attr( "aria-required", "true" );
- },
-
- // http://jqueryvalidation.org/Validator.form/
- form: function() {
- this.checkForm();
- $.extend( this.submitted, this.errorMap );
- this.invalid = $.extend({}, this.errorMap );
- if ( !this.valid() ) {
- $( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
- }
- this.showErrors();
- return this.valid();
- },
-
- checkForm: function() {
- this.prepareForm();
- for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {
- this.check( elements[ i ] );
- }
- return this.valid();
- },
-
- // http://jqueryvalidation.org/Validator.element/
- element: function( element ) {
- var cleanElement = this.clean( element ),
- checkElement = this.validationTargetFor( cleanElement ),
- result = true;
-
- this.lastElement = checkElement;
-
- if ( checkElement === undefined ) {
- delete this.invalid[ cleanElement.name ];
- } else {
- this.prepareElement( checkElement );
- this.currentElements = $( checkElement );
-
- result = this.check( checkElement ) !== false;
- if ( result ) {
- delete this.invalid[ checkElement.name ];
- } else {
- this.invalid[ checkElement.name ] = true;
- }
- }
- // Add aria-invalid status for screen readers
- $( element ).attr( "aria-invalid", !result );
-
- if ( !this.numberOfInvalids() ) {
- // Hide error containers on last error
- this.toHide = this.toHide.add( this.containers );
- }
- this.showErrors();
- return result;
- },
-
- // http://jqueryvalidation.org/Validator.showErrors/
- showErrors: function( errors ) {
- if ( errors ) {
- // add items to error list and map
- $.extend( this.errorMap, errors );
- this.errorList = [];
- for ( var name in errors ) {
- this.errorList.push({
- message: errors[ name ],
- element: this.findByName( name )[ 0 ]
- });
- }
- // remove items from success list
- this.successList = $.grep( this.successList, function( element ) {
- return !( element.name in errors );
- });
- }
- if ( this.settings.showErrors ) {
- this.settings.showErrors.call( this, this.errorMap, this.errorList );
- } else {
- this.defaultShowErrors();
- }
- },
-
- // http://jqueryvalidation.org/Validator.resetForm/
- resetForm: function() {
- if ( $.fn.resetForm ) {
- $( this.currentForm ).resetForm();
- }
- this.submitted = {};
- this.lastElement = null;
- this.prepareForm();
- this.hideErrors();
- var i, elements = this.elements()
- .removeData( "previousValue" )
- .removeAttr( "aria-invalid" );
-
- if ( this.settings.unhighlight ) {
- for ( i = 0; elements[ i ]; i++ ) {
- this.settings.unhighlight.call( this, elements[ i ],
- this.settings.errorClass, "" );
- }
- } else {
- elements.removeClass( this.settings.errorClass );
- }
- },
-
- numberOfInvalids: function() {
- return this.objectLength( this.invalid );
- },
-
- objectLength: function( obj ) {
- /* jshint unused: false */
- var count = 0,
- i;
- for ( i in obj ) {
- count++;
- }
- return count;
- },
-
- hideErrors: function() {
- this.hideThese( this.toHide );
- },
-
- hideThese: function( errors ) {
- errors.not( this.containers ).text( "" );
- this.addWrapper( errors ).hide();
- },
-
- valid: function() {
- return this.size() === 0;
- },
-
- size: function() {
- return this.errorList.length;
- },
-
- focusInvalid: function() {
- if ( this.settings.focusInvalid ) {
- try {
- $( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [])
- .filter( ":visible" )
- .focus()
- // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find
- .trigger( "focusin" );
- } catch ( e ) {
- // ignore IE throwing errors when focusing hidden elements
- }
- }
- },
-
- findLastActive: function() {
- var lastActive = this.lastActive;
- return lastActive && $.grep( this.errorList, function( n ) {
- return n.element.name === lastActive.name;
- }).length === 1 && lastActive;
- },
-
- elements: function() {
- var validator = this,
- rulesCache = {};
-
- // select all valid inputs inside the form (no submit or reset buttons)
- return $( this.currentForm )
- .find( "input, select, textarea" )
- .not( ":submit, :reset, :image, :disabled" )
- .not( this.settings.ignore )
- .filter( function() {
- if ( !this.name && validator.settings.debug && window.console ) {
- console.error( "%o has no name assigned", this );
- }
-
- // select only the first element for each name, and only those with rules specified
- if ( this.name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
- return false;
- }
-
- rulesCache[ this.name ] = true;
- return true;
- });
- },
-
- clean: function( selector ) {
- return $( selector )[ 0 ];
- },
-
- errors: function() {
- var errorClass = this.settings.errorClass.split( " " ).join( "." );
- return $( this.settings.errorElement + "." + errorClass, this.errorContext );
- },
-
- reset: function() {
- this.successList = [];
- this.errorList = [];
- this.errorMap = {};
- this.toShow = $( [] );
- this.toHide = $( [] );
- this.currentElements = $( [] );
- },
-
- prepareForm: function() {
- this.reset();
- this.toHide = this.errors().add( this.containers );
- },
-
- prepareElement: function( element ) {
- this.reset();
- this.toHide = this.errorsFor( element );
- },
-
- elementValue: function( element ) {
- var val,
- $element = $( element ),
- type = element.type;
-
- if ( type === "radio" || type === "checkbox" ) {
- return this.findByName( element.name ).filter(":checked").val();
- } else if ( type === "number" && typeof element.validity !== "undefined" ) {
- return element.validity.badInput ? false : $element.val();
- }
-
- val = $element.val();
- if ( typeof val === "string" ) {
- return val.replace(/\r/g, "" );
- }
- return val;
- },
-
- check: function( element ) {
- element = this.validationTargetFor( this.clean( element ) );
-
- var rules = $( element ).rules(),
- rulesCount = $.map( rules, function( n, i ) {
- return i;
- }).length,
- dependencyMismatch = false,
- val = this.elementValue( element ),
- result, method, rule;
-
- for ( method in rules ) {
- rule = { method: method, parameters: rules[ method ] };
- try {
-
- result = $.validator.methods[ method ].call( this, val, element, rule.parameters );
-
- // if a method indicates that the field is optional and therefore valid,
- // don't mark it as valid when there are no other rules
- if ( result === "dependency-mismatch" && rulesCount === 1 ) {
- dependencyMismatch = true;
- continue;
- }
- dependencyMismatch = false;
-
- if ( result === "pending" ) {
- this.toHide = this.toHide.not( this.errorsFor( element ) );
- return;
- }
-
- if ( !result ) {
- this.formatAndAdd( element, rule );
- return false;
- }
- } catch ( e ) {
- if ( this.settings.debug && window.console ) {
- console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e );
- }
- if ( e instanceof TypeError ) {
- e.message += ". Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.";
- }
-
- throw e;
- }
- }
- if ( dependencyMismatch ) {
- return;
- }
- if ( this.objectLength( rules ) ) {
- this.successList.push( element );
- }
- return true;
- },
-
- // return the custom message for the given element and validation method
- // specified in the element's HTML5 data attribute
- // return the generic message if present and no method specific message is present
- customDataMessage: function( element, method ) {
- return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() +
- method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" );
- },
-
- // return the custom message for the given element name and validation method
- customMessage: function( name, method ) {
- var m = this.settings.messages[ name ];
- return m && ( m.constructor === String ? m : m[ method ]);
- },
-
- // return the first defined argument, allowing empty strings
- findDefined: function() {
- for ( var i = 0; i < arguments.length; i++) {
- if ( arguments[ i ] !== undefined ) {
- return arguments[ i ];
- }
- }
- return undefined;
- },
-
- defaultMessage: function( element, method ) {
- return this.findDefined(
- this.customMessage( element.name, method ),
- this.customDataMessage( element, method ),
- // title is never undefined, so handle empty string as undefined
- !this.settings.ignoreTitle && element.title || undefined,
- $.validator.messages[ method ],
- "<strong>Warning: No message defined for " + element.name + "</strong>"
- );
- },
-
- formatAndAdd: function( element, rule ) {
- var message = this.defaultMessage( element, rule.method ),
- theregex = /\$?\{(\d+)\}/g;
- if ( typeof message === "function" ) {
- message = message.call( this, rule.parameters, element );
- } else if ( theregex.test( message ) ) {
- message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
- }
- this.errorList.push({
- message: message,
- element: element,
- method: rule.method
- });
-
- this.errorMap[ element.name ] = message;
- this.submitted[ element.name ] = message;
- },
-
- addWrapper: function( toToggle ) {
- if ( this.settings.wrapper ) {
- toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );
- }
- return toToggle;
- },
-
- defaultShowErrors: function() {
- var i, elements, error;
- for ( i = 0; this.errorList[ i ]; i++ ) {
- error = this.errorList[ i ];
- if ( this.settings.highlight ) {
- this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );
- }
- this.showLabel( error.element, error.message );
- }
- if ( this.errorList.length ) {
- this.toShow = this.toShow.add( this.containers );
- }
- if ( this.settings.success ) {
- for ( i = 0; this.successList[ i ]; i++ ) {
- this.showLabel( this.successList[ i ] );
- }
- }
- if ( this.settings.unhighlight ) {
- for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {
- this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );
- }
- }
- this.toHide = this.toHide.not( this.toShow );
- this.hideErrors();
- this.addWrapper( this.toShow ).show();
- },
-
- validElements: function() {
- return this.currentElements.not( this.invalidElements() );
- },
-
- invalidElements: function() {
- return $( this.errorList ).map(function() {
- return this.element;
- });
- },
-
- showLabel: function( element, message ) {
- var place, group, errorID,
- error = this.errorsFor( element ),
- elementID = this.idOrName( element ),
- describedBy = $( element ).attr( "aria-describedby" );
- if ( error.length ) {
- // refresh error/success class
- error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );
- // replace message on existing label
- error.html( message );
- } else {
- // create error element
- error = $( "<" + this.settings.errorElement + ">" )
- .attr( "id", elementID + "-error" )
- .addClass( this.settings.errorClass )
- .html( message || "" );
-
- // Maintain reference to the element to be placed into the DOM
- place = error;
- if ( this.settings.wrapper ) {
- // make sure the element is visible, even in IE
- // actually showing the wrapped element is handled elsewhere
- place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent();
- }
- if ( this.labelContainer.length ) {
- this.labelContainer.append( place );
- } else if ( this.settings.errorPlacement ) {
- this.settings.errorPlacement( place, $( element ) );
- } else {
- place.insertAfter( element );
- }
-
- // Link error back to the element
- if ( error.is( "label" ) ) {
- // If the error is a label, then associate using 'for'
- error.attr( "for", elementID );
- } else if ( error.parents( "label[for='" + elementID + "']" ).length === 0 ) {
- // If the element is not a child of an associated label, then it's necessary
- // to explicitly apply aria-describedby
-
- errorID = error.attr( "id" ).replace( /(:|\.|\[|\]|\$)/g, "\\$1");
- // Respect existing non-error aria-describedby
- if ( !describedBy ) {
- describedBy = errorID;
- } else if ( !describedBy.match( new RegExp( "\\b" + errorID + "\\b" ) ) ) {
- // Add to end of list if not already present
- describedBy += " " + errorID;
- }
- $( element ).attr( "aria-describedby", describedBy );
-
- // If this element is grouped, then assign to all elements in the same group
- group = this.groups[ element.name ];
- if ( group ) {
- $.each( this.groups, function( name, testgroup ) {
- if ( testgroup === group ) {
- $( "[name='" + name + "']", this.currentForm )
- .attr( "aria-describedby", error.attr( "id" ) );
- }
- });
- }
- }
- }
- if ( !message && this.settings.success ) {
- error.text( "" );
- if ( typeof this.settings.success === "string" ) {
- error.addClass( this.settings.success );
- } else {
- this.settings.success( error, element );
- }
- }
- this.toShow = this.toShow.add( error );
- },
-
- errorsFor: function( element ) {
- var name = this.idOrName( element ),
- describer = $( element ).attr( "aria-describedby" ),
- selector = "label[for='" + name + "'], label[for='" + name + "'] *";
-
- // aria-describedby should directly reference the error element
- if ( describer ) {
- selector = selector + ", #" + describer.replace( /\s+/g, ", #" );
- }
- return this
- .errors()
- .filter( selector );
- },
-
- idOrName: function( element ) {
- return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );
- },
-
- validationTargetFor: function( element ) {
-
- // If radio/checkbox, validate first element in group instead
- if ( this.checkable( element ) ) {
- element = this.findByName( element.name );
- }
-
- // Always apply ignore filter
- return $( element ).not( this.settings.ignore )[ 0 ];
- },
-
- checkable: function( element ) {
- return ( /radio|checkbox/i ).test( element.type );
- },
-
- findByName: function( name ) {
- return $( this.currentForm ).find( "[name='" + name + "']" );
- },
-
- getLength: function( value, element ) {
- switch ( element.nodeName.toLowerCase() ) {
- case "select":
- return $( "option:selected", element ).length;
- case "input":
- if ( this.checkable( element ) ) {
- return this.findByName( element.name ).filter( ":checked" ).length;
- }
- }
- return value.length;
- },
-
- depend: function( param, element ) {
- return this.dependTypes[typeof param] ? this.dependTypes[typeof param]( param, element ) : true;
- },
-
- dependTypes: {
- "boolean": function( param ) {
- return param;
- },
- "string": function( param, element ) {
- return !!$( param, element.form ).length;
- },
- "function": function( param, element ) {
- return param( element );
- }
- },
-
- optional: function( element ) {
- var val = this.elementValue( element );
- return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch";
- },
-
- startRequest: function( element ) {
- if ( !this.pending[ element.name ] ) {
- this.pendingRequest++;
- this.pending[ element.name ] = true;
- }
- },
-
- stopRequest: function( element, valid ) {
- this.pendingRequest--;
- // sometimes synchronization fails, make sure pendingRequest is never < 0
- if ( this.pendingRequest < 0 ) {
- this.pendingRequest = 0;
- }
- delete this.pending[ element.name ];
- if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {
- $( this.currentForm ).submit();
- this.formSubmitted = false;
- } else if (!valid && this.pendingRequest === 0 && this.formSubmitted ) {
- $( this.currentForm ).triggerHandler( "invalid-form", [ this ]);
- this.formSubmitted = false;
- }
- },
-
- previousValue: function( element ) {
- return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
- old: null,
- valid: true,
- message: this.defaultMessage( element, "remote" )
- });
- },
-
- // cleans up all forms and elements, removes validator-specific events
- destroy: function() {
- this.resetForm();
-
- $( this.currentForm )
- .off( ".validate" )
- .removeData( "validator" );
- }
-
- },
-
- classRuleSettings: {
- required: { required: true },
- email: { email: true },
- url: { url: true },
- date: { date: true },
- dateISO: { dateISO: true },
- number: { number: true },
- digits: { digits: true },
- creditcard: { creditcard: true }
- },
-
- addClassRules: function( className, rules ) {
- if ( className.constructor === String ) {
- this.classRuleSettings[ className ] = rules;
- } else {
- $.extend( this.classRuleSettings, className );
- }
- },
-
- classRules: function( element ) {
- var rules = {},
- classes = $( element ).attr( "class" );
-
- if ( classes ) {
- $.each( classes.split( " " ), function() {
- if ( this in $.validator.classRuleSettings ) {
- $.extend( rules, $.validator.classRuleSettings[ this ]);
- }
- });
- }
- return rules;
- },
-
- normalizeAttributeRule: function( rules, type, method, value ) {
-
- // convert the value to a number for number inputs, and for text for backwards compability
- // allows type="date" and others to be compared as strings
- if ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {
- value = Number( value );
-
- // Support Opera Mini, which returns NaN for undefined minlength
- if ( isNaN( value ) ) {
- value = undefined;
- }
- }
-
- if ( value || value === 0 ) {
- rules[ method ] = value;
- } else if ( type === method && type !== "range" ) {
-
- // exception: the jquery validate 'range' method
- // does not test for the html5 'range' type
- rules[ method ] = true;
- }
- },
-
- attributeRules: function( element ) {
- var rules = {},
- $element = $( element ),
- type = element.getAttribute( "type" ),
- method, value;
-
- for ( method in $.validator.methods ) {
-
- // support for <input required> in both html5 and older browsers
- if ( method === "required" ) {
- value = element.getAttribute( method );
-
- // Some browsers return an empty string for the required attribute
- // and non-HTML5 browsers might have required="" markup
- if ( value === "" ) {
- value = true;
- }
-
- // force non-HTML5 browsers to return bool
- value = !!value;
- } else {
- value = $element.attr( method );
- }
-
- this.normalizeAttributeRule( rules, type, method, value );
- }
-
- // maxlength may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs
- if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {
- delete rules.maxlength;
- }
-
- return rules;
- },
-
- dataRules: function( element ) {
- var rules = {},
- $element = $( element ),
- type = element.getAttribute( "type" ),
- method, value;
-
- for ( method in $.validator.methods ) {
- value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );
- this.normalizeAttributeRule( rules, type, method, value );
- }
- return rules;
- },
-
- staticRules: function( element ) {
- var rules = {},
- validator = $.data( element.form, "validator" );
-
- if ( validator.settings.rules ) {
- rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};
- }
- return rules;
- },
-
- normalizeRules: function( rules, element ) {
- // handle dependency check
- $.each( rules, function( prop, val ) {
- // ignore rule when param is explicitly false, eg. required:false
- if ( val === false ) {
- delete rules[ prop ];
- return;
- }
- if ( val.param || val.depends ) {
- var keepRule = true;
- switch ( typeof val.depends ) {
- case "string":
- keepRule = !!$( val.depends, element.form ).length;
- break;
- case "function":
- keepRule = val.depends.call( element, element );
- break;
- }
- if ( keepRule ) {
- rules[ prop ] = val.param !== undefined ? val.param : true;
- } else {
- delete rules[ prop ];
- }
- }
- });
-
- // evaluate parameters
- $.each( rules, function( rule, parameter ) {
- rules[ rule ] = $.isFunction( parameter ) ? parameter( element ) : parameter;
- });
-
- // clean number parameters
- $.each([ "minlength", "maxlength" ], function() {
- if ( rules[ this ] ) {
- rules[ this ] = Number( rules[ this ] );
- }
- });
- $.each([ "rangelength", "range" ], function() {
- var parts;
- if ( rules[ this ] ) {
- if ( $.isArray( rules[ this ] ) ) {
- rules[ this ] = [ Number( rules[ this ][ 0 ]), Number( rules[ this ][ 1 ] ) ];
- } else if ( typeof rules[ this ] === "string" ) {
- parts = rules[ this ].replace(/[\[\]]/g, "" ).split( /[\s,]+/ );
- rules[ this ] = [ Number( parts[ 0 ]), Number( parts[ 1 ] ) ];
- }
- }
- });
-
- if ( $.validator.autoCreateRanges ) {
- // auto-create ranges
- if ( rules.min != null && rules.max != null ) {
- rules.range = [ rules.min, rules.max ];
- delete rules.min;
- delete rules.max;
- }
- if ( rules.minlength != null && rules.maxlength != null ) {
- rules.rangelength = [ rules.minlength, rules.maxlength ];
- delete rules.minlength;
- delete rules.maxlength;
- }
- }
-
- return rules;
- },
-
- // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
- normalizeRule: function( data ) {
- if ( typeof data === "string" ) {
- var transformed = {};
- $.each( data.split( /\s/ ), function() {
- transformed[ this ] = true;
- });
- data = transformed;
- }
- return data;
- },
-
- // http://jqueryvalidation.org/jQuery.validator.addMethod/
- addMethod: function( name, method, message ) {
- $.validator.methods[ name ] = method;
- $.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];
- if ( method.length < 3 ) {
- $.validator.addClassRules( name, $.validator.normalizeRule( name ) );
- }
- },
-
- methods: {
-
- // http://jqueryvalidation.org/required-method/
- required: function( value, element, param ) {
- // check if dependency is met
- if ( !this.depend( param, element ) ) {
- return "dependency-mismatch";
- }
- if ( element.nodeName.toLowerCase() === "select" ) {
- // could be an array for select-multiple or a string, both are fine this way
- var val = $( element ).val();
- return val && val.length > 0;
- }
- if ( this.checkable( element ) ) {
- return this.getLength( value, element ) > 0;
- }
- return value.length > 0;
- },
-
- // http://jqueryvalidation.org/email-method/
- email: function( value, element ) {
- // From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address
- // Retrieved 2014-01-14
- // If you have a problem with this implementation, report a bug against the above spec
- // Or use custom methods to implement your own email validation
- return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );
- },
-
- // http://jqueryvalidation.org/url-method/
- url: function( value, element ) {
-
- // Copyright (c) 2010-2013 Diego Perini, MIT licensed
- // https://gist.github.com/dperini/729294
- // see also https://mathiasbynens.be/demo/url-regex
- // modified to allow protocol-relative URLs
- return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value );
- },
-
- // http://jqueryvalidation.org/date-method/
- date: function( value, element ) {
- return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );
- },
-
- // http://jqueryvalidation.org/dateISO-method/
- dateISO: function( value, element ) {
- return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );
- },
-
- // http://jqueryvalidation.org/number-method/
- number: function( value, element ) {
- return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value );
- },
-
- // http://jqueryvalidation.org/digits-method/
- digits: function( value, element ) {
- return this.optional( element ) || /^\d+$/.test( value );
- },
-
- // http://jqueryvalidation.org/creditcard-method/
- // based on http://en.wikipedia.org/wiki/Luhn_algorithm
- creditcard: function( value, element ) {
- if ( this.optional( element ) ) {
- return "dependency-mismatch";
- }
- // accept only spaces, digits and dashes
- if ( /[^0-9 \-]+/.test( value ) ) {
- return false;
- }
- var nCheck = 0,
- nDigit = 0,
- bEven = false,
- n, cDigit;
-
- value = value.replace( /\D/g, "" );
-
- // Basing min and max length on
- // http://developer.ean.com/general_info/Valid_Credit_Card_Types
- if ( value.length < 13 || value.length > 19 ) {
- return false;
- }
-
- for ( n = value.length - 1; n >= 0; n--) {
- cDigit = value.charAt( n );
- nDigit = parseInt( cDigit, 10 );
- if ( bEven ) {
- if ( ( nDigit *= 2 ) > 9 ) {
- nDigit -= 9;
- }
- }
- nCheck += nDigit;
- bEven = !bEven;
- }
-
- return ( nCheck % 10 ) === 0;
- },
-
- // http://jqueryvalidation.org/minlength-method/
- minlength: function( value, element, param ) {
- var length = $.isArray( value ) ? value.length : this.getLength( value, element );
- return this.optional( element ) || length >= param;
- },
-
- // http://jqueryvalidation.org/maxlength-method/
- maxlength: function( value, element, param ) {
- var length = $.isArray( value ) ? value.length : this.getLength( value, element );
- return this.optional( element ) || length <= param;
- },
-
- // http://jqueryvalidation.org/rangelength-method/
- rangelength: function( value, element, param ) {
- var length = $.isArray( value ) ? value.length : this.getLength( value, element );
- return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );
- },
-
- // http://jqueryvalidation.org/min-method/
- min: function( value, element, param ) {
- return this.optional( element ) || value >= param;
- },
-
- // http://jqueryvalidation.org/max-method/
- max: function( value, element, param ) {
- return this.optional( element ) || value <= param;
- },
-
- // http://jqueryvalidation.org/range-method/
- range: function( value, element, param ) {
- return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );
- },
-
- // http://jqueryvalidation.org/equalTo-method/
- equalTo: function( value, element, param ) {
- // bind to the blur event of the target in order to revalidate whenever the target field is updated
- // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead
- var target = $( param );
- if ( this.settings.onfocusout ) {
- target.off( ".validate-equalTo" ).on( "blur.validate-equalTo", function() {
- $( element ).valid();
- });
- }
- return value === target.val();
- },
-
- // http://jqueryvalidation.org/remote-method/
- remote: function( value, element, param ) {
- if ( this.optional( element ) ) {
- return "dependency-mismatch";
- }
-
- var previous = this.previousValue( element ),
- validator, data;
-
- if (!this.settings.messages[ element.name ] ) {
- this.settings.messages[ element.name ] = {};
- }
- previous.originalMessage = this.settings.messages[ element.name ].remote;
- this.settings.messages[ element.name ].remote = previous.message;
-
- param = typeof param === "string" && { url: param } || param;
-
- if ( previous.old === value ) {
- return previous.valid;
- }
-
- previous.old = value;
- validator = this;
- this.startRequest( element );
- data = {};
- data[ element.name ] = value;
- $.ajax( $.extend( true, {
- mode: "abort",
- port: "validate" + element.name,
- dataType: "json",
- data: data,
- context: validator.currentForm,
- success: function( response ) {
- var valid = response === true || response === "true",
- errors, message, submitted;
-
- validator.settings.messages[ element.name ].remote = previous.originalMessage;
- if ( valid ) {
- submitted = validator.formSubmitted;
- validator.prepareElement( element );
- validator.formSubmitted = submitted;
- validator.successList.push( element );
- delete validator.invalid[ element.name ];
- validator.showErrors();
- } else {
- errors = {};
- message = response || validator.defaultMessage( element, "remote" );
- errors[ element.name ] = previous.message = $.isFunction( message ) ? message( value ) : message;
- validator.invalid[ element.name ] = true;
- validator.showErrors( errors );
- }
- previous.valid = valid;
- validator.stopRequest( element, valid );
- }
- }, param ) );
- return "pending";
- }
- }
-
-});
-
-// ajax mode: abort
-// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
-// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
-
-var pendingRequests = {},
- ajax;
-// Use a prefilter if available (1.5+)
-if ( $.ajaxPrefilter ) {
- $.ajaxPrefilter(function( settings, _, xhr ) {
- var port = settings.port;
- if ( settings.mode === "abort" ) {
- if ( pendingRequests[port] ) {
- pendingRequests[port].abort();
- }
- pendingRequests[port] = xhr;
- }
- });
-} else {
- // Proxy ajax
- ajax = $.ajax;
- $.ajax = function( settings ) {
- var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
- port = ( "port" in settings ? settings : $.ajaxSettings ).port;
- if ( mode === "abort" ) {
- if ( pendingRequests[port] ) {
- pendingRequests[port].abort();
- }
- pendingRequests[port] = ajax.apply(this, arguments);
- return pendingRequests[port];
- }
- return ajax.apply(this, arguments);
- };
-}
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/jquery.validate.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/jquery.validate.min.js
deleted file mode 100644
index 643837b9..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/jquery.validate.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.settings.submitHandler&&(c.submitButton=b.target),a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.settings.submitHandler?(c.submitButton&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),e=c.settings.submitHandler.call(c,c.currentForm,b),c.submitButton&&d.remove(),void 0!==e?e:!1):!0}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,d=d.concat(c.errorList)}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(b,c){i[c]=f[c],delete f[c],"required"===c&&a(j).removeAttr("aria-required")}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g),a(j).attr("aria-required","true")),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}),a.extend(a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){return!!a.trim(""+a(b).val())},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||-1!==a.inArray(c.keyCode,d)||(b.name in this.submitted||b===this.lastElement)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date ( ISO ).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c=a.data(this.form,"validator"),d="on"+b.type.replace(/^validate/,""),e=c.settings;e[d]&&!a(this).is(e.ignore)&&e[d].call(c,this,b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler),a(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required","true")},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c=this.clean(b),d=this.validationTargetFor(c),e=!0;return this.lastElement=d,void 0===d?delete this.invalid[c.name]:(this.prepareElement(d),this.currentElements=a(d),e=this.check(d)!==!1,e?delete this.invalid[d.name]:this.invalid[d.name]=!0),a(b).attr("aria-invalid",!e),this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),e},showErrors:function(b){if(b){a.extend(this.errorMap,b),this.errorList=[];for(var c in b)this.errorList.push({message:b[c],element:this.findByName(c)[0]});this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors();var b,c=this.elements().removeData("previousValue").removeAttr("aria-invalid");if(this.settings.unhighlight)for(b=0;c[b];b++)this.settings.unhighlight.call(this,c[b],this.settings.errorClass,"");else c.removeClass(this.settings.errorClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){return!this.name&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in c||!b.objectLength(a(this).rules())?!1:(c[this.name]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([]),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d=a(b),e=b.type;return"radio"===e||"checkbox"===e?this.findByName(b.name).filter(":checked").val():"number"===e&&"undefined"!=typeof b.validity?b.validity.badInput?!1:d.val():(c=d.val(),"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f=a(b).rules(),g=a.map(f,function(a,b){return b}).length,h=!1,i=this.elementValue(b);for(d in f){e={method:d,parameters:f[d]};try{if(c=a.validator.methods[d].call(this,i,b,e.parameters),"dependency-mismatch"===c&&1===g){h=!0;continue}if(h=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(j){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",j),j instanceof TypeError&&(j.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),j}}if(!h)return this.objectLength(f)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a];return void 0},defaultMessage:function(b,c){return this.findDefined(this.customMessage(b.name,c),this.customDataMessage(b,c),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c],"<strong>Warning: No message defined for "+b.name+"</strong>")},formatAndAdd:function(b,c){var d=this.defaultMessage(b,c.method),e=/\$?\{(\d+)\}/g;"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),this.errorList.push({message:d,element:b,method:c.method}),this.errorMap[b.name]=d,this.submitted[b.name]=d},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g=this.errorsFor(b),h=this.idOrName(b),i=a(b).attr("aria-describedby");g.length?(g.removeClass(this.settings.validClass).addClass(this.settings.errorClass),g.html(c)):(g=a("<"+this.settings.errorElement+">").attr("id",h+"-error").addClass(this.settings.errorClass).html(c||""),d=g,this.settings.wrapper&&(d=g.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement(d,a(b)):d.insertAfter(b),g.is("label")?g.attr("for",h):0===g.parents("label[for='"+h+"']").length&&(f=g.attr("id").replace(/(:|\.|\[|\]|\$)/g,"\\$1"),i?i.match(new RegExp("\\b"+f+"\\b"))||(i+=" "+f):i=f,a(b).attr("aria-describedby",i),e=this.groups[b.name],e&&a.each(this.groups,function(b,c){c===e&&a("[name='"+b+"']",this.currentForm).attr("aria-describedby",g.attr("id"))}))),!c&&this.settings.success&&(g.text(""),"string"==typeof this.settings.success?g.addClass(this.settings.success):this.settings.success(g,b)),this.toShow=this.toShow.add(g)},errorsFor:function(b){var c=this.idOrName(b),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+d.replace(/\s+/g,", #")),this.errors().filter(e)},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+b+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):!0},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(a){this.pending[a.name]||(this.pendingRequest++,this.pending[a.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b){return a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,"remote")})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0!==e.param?e.param:!0:delete b[d]}}),a.each(b,function(d,e){b[d]=a.isFunction(e)?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||d>=e},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||c>=a},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.off(".validate-equalTo").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d){if(this.optional(c))return"dependency-mismatch";var e,f,g=this.previousValue(c);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),g.originalMessage=this.settings.messages[c.name].remote,this.settings.messages[c.name].remote=g.message,d="string"==typeof d&&{url:d}||d,g.old===b?g.valid:(g.old=b,e=this,this.startRequest(c),f={},f[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:f,context:e.currentForm,success:function(d){var f,h,i,j=d===!0||"true"===d;e.settings.messages[c.name].remote=g.originalMessage,j?(i=e.formSubmitted,e.prepareElement(c),e.formSubmitted=i,e.successList.push(c),delete e.invalid[c.name],e.showErrors()):(f={},h=d||e.defaultMessage(c,"remote"),f[c.name]=g.message=a.isFunction(h)?h(b):h,e.invalid[c.name]=!0,e.showErrors(f)),g.valid=j,e.stopRequest(c,j)}},d)),"pending")}}});var b,c={};a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ar.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ar.js
deleted file mode 100644
index e609dbb6..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ar.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: AR (Arabic; العربية)
- */
-$.extend($.validator.messages, {
- required: "هذا الحقل إلزامي",
- remote: "يرجى تصحيح هذا الحقل للمتابعة",
- email: "رجاء إدخال عنوان بريد إلكتروني صحيح",
- url: "رجاء إدخال عنوان موقع إلكتروني صحيح",
- date: "رجاء إدخال تاريخ صحيح",
- dateISO: "رجاء إدخال تاريخ صحيح (ISO)",
- number: "رجاء إدخال عدد بطريقة صحيحة",
- digits: "رجاء إدخال أرقام فقط",
- creditcard: "رجاء إدخال رقم بطاقة ائتمان صحيح",
- equalTo: "رجاء إدخال نفس القيمة",
- extension: "رجاء إدخال ملف بامتداد موافق عليه",
- maxlength: $.validator.format("الحد الأقصى لعدد الحروف هو {0}"),
- minlength: $.validator.format("الحد الأدنى لعدد الحروف هو {0}"),
- rangelength: $.validator.format("عدد الحروف يجب أن يكون بين {0} و {1}"),
- range: $.validator.format("رجاء إدخال عدد قيمته بين {0} و {1}"),
- max: $.validator.format("رجاء إدخال عدد أقل من أو يساوي (0}"),
- min: $.validator.format("رجاء إدخال عدد أكبر من أو يساوي (0}")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ar.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ar.min.js
deleted file mode 100644
index b641c1a0..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ar.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"هذا الحقل إلزامي",remote:"يرجى تصحيح هذا الحقل للمتابعة",email:"رجاء إدخال عنوان بريد إلكتروني صحيح",url:"رجاء إدخال عنوان موقع إلكتروني صحيح",date:"رجاء إدخال تاريخ صحيح",dateISO:"رجاء إدخال تاريخ صحيح (ISO)",number:"رجاء إدخال عدد بطريقة صحيحة",digits:"رجاء إدخال أرقام فقط",creditcard:"رجاء إدخال رقم بطاقة ائتمان صحيح",equalTo:"رجاء إدخال نفس القيمة",extension:"رجاء إدخال ملف بامتداد موافق عليه",maxlength:a.validator.format("الحد الأقصى لعدد الحروف هو {0}"),minlength:a.validator.format("الحد الأدنى لعدد الحروف هو {0}"),rangelength:a.validator.format("عدد الحروف يجب أن يكون بين {0} و {1}"),range:a.validator.format("رجاء إدخال عدد قيمته بين {0} و {1}"),max:a.validator.format("رجاء إدخال عدد أقل من أو يساوي (0}"),min:a.validator.format("رجاء إدخال عدد أكبر من أو يساوي (0}")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bg.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bg.js
deleted file mode 100644
index fea21cf5..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bg.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: BG (Bulgarian; български език)
- */
-$.extend($.validator.messages, {
- required: "Полето е задължително.",
- remote: "Моля, въведете правилната стойност.",
- email: "Моля, въведете валиден email.",
- url: "Моля, въведете валидно URL.",
- date: "Моля, въведете валидна дата.",
- dateISO: "Моля, въведете валидна дата (ISO).",
- number: "Моля, въведете валиден номер.",
- digits: "Моля, въведете само цифри.",
- creditcard: "Моля, въведете валиден номер на кредитна карта.",
- equalTo: "Моля, въведете същата стойност отново.",
- extension: "Моля, въведете стойност с валидно разширение.",
- maxlength: $.validator.format("Моля, въведете повече от {0} символа."),
- minlength: $.validator.format("Моля, въведете поне {0} символа."),
- rangelength: $.validator.format("Моля, въведете стойност с дължина между {0} и {1} символа."),
- range: $.validator.format("Моля, въведете стойност между {0} и {1}."),
- max: $.validator.format("Моля, въведете стойност по-малка или равна на {0}."),
- min: $.validator.format("Моля, въведете стойност по-голяма или равна на {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bg.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bg.min.js
deleted file mode 100644
index 8f7251de..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bg.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Полето е задължително.",remote:"Моля, въведете правилната стойност.",email:"Моля, въведете валиден email.",url:"Моля, въведете валидно URL.",date:"Моля, въведете валидна дата.",dateISO:"Моля, въведете валидна дата (ISO).",number:"Моля, въведете валиден номер.",digits:"Моля, въведете само цифри.",creditcard:"Моля, въведете валиден номер на кредитна карта.",equalTo:"Моля, въведете същата стойност отново.",extension:"Моля, въведете стойност с валидно разширение.",maxlength:a.validator.format("Моля, въведете повече от {0} символа."),minlength:a.validator.format("Моля, въведете поне {0} символа."),rangelength:a.validator.format("Моля, въведете стойност с дължина между {0} и {1} символа."),range:a.validator.format("Моля, въведете стойност между {0} и {1}."),max:a.validator.format("Моля, въведете стойност по-малка или равна на {0}."),min:a.validator.format("Моля, въведете стойност по-голяма или равна на {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bn_BD.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bn_BD.js
deleted file mode 100644
index 4d68aa41..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bn_BD.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: bn_BD (Bengali, Bangladesh)
- */
-$.extend($.validator.messages, {
- required: "এই তথ্যটি আবশ্যক।",
- remote: "এই তথ্যটি ঠিক করুন।",
- email: "অনুগ্রহ করে একটি সঠিক মেইল ঠিকানা লিখুন।",
- url: "অনুগ্রহ করে একটি সঠিক লিঙ্ক দিন।",
- date: "তারিখ সঠিক নয়।",
- dateISO: "অনুগ্রহ করে একটি সঠিক (ISO) তারিখ লিখুন।",
- number: "অনুগ্রহ করে একটি সঠিক নম্বর লিখুন।",
- digits: "এখানে শুধু সংখ্যা ব্যবহার করা যাবে।",
- creditcard: "অনুগ্রহ করে একটি ক্রেডিট কার্ডের সঠিক নম্বর লিখুন।",
- equalTo: "একই মান আবার লিখুন।",
- extension: "সঠিক ধরনের ফাইল আপলোড করুন।",
- maxlength: $.validator.format("{0}টির বেশি অক্ষর লেখা যাবে না।"),
- minlength: $.validator.format("{0}টির কম অক্ষর লেখা যাবে না।"),
- rangelength: $.validator.format("{0} থেকে {1} টি অক্ষর সম্বলিত মান লিখুন।"),
- range: $.validator.format("{0} থেকে {1} এর মধ্যে একটি মান ব্যবহার করুন।"),
- max: $.validator.format("অনুগ্রহ করে {0} বা তার চাইতে কম মান ব্যবহার করুন।"),
- min: $.validator.format("অনুগ্রহ করে {0} বা তার চাইতে বেশি মান ব্যবহার করুন।")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bn_BD.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bn_BD.min.js
deleted file mode 100644
index 38571f2f..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_bn_BD.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"এই তথ্যটি আবশ্যক।",remote:"এই তথ্যটি ঠিক করুন।",email:"অনুগ্রহ করে একটি সঠিক মেইল ঠিকানা লিখুন।",url:"অনুগ্রহ করে একটি সঠিক লিঙ্ক দিন।",date:"তারিখ সঠিক নয়।",dateISO:"অনুগ্রহ করে একটি সঠিক (ISO) তারিখ লিখুন।",number:"অনুগ্রহ করে একটি সঠিক নম্বর লিখুন।",digits:"এখানে শুধু সংখ্যা ব্যবহার করা যাবে।",creditcard:"অনুগ্রহ করে একটি ক্রেডিট কার্ডের সঠিক নম্বর লিখুন।",equalTo:"একই মান আবার লিখুন।",extension:"সঠিক ধরনের ফাইল আপলোড করুন।",maxlength:a.validator.format("{0}টির বেশি অক্ষর লেখা যাবে না।"),minlength:a.validator.format("{0}টির কম অক্ষর লেখা যাবে না।"),rangelength:a.validator.format("{0} থেকে {1} টি অক্ষর সম্বলিত মান লিখুন।"),range:a.validator.format("{0} থেকে {1} এর মধ্যে একটি মান ব্যবহার করুন।"),max:a.validator.format("অনুগ্রহ করে {0} বা তার চাইতে কম মান ব্যবহার করুন।"),min:a.validator.format("অনুগ্রহ করে {0} বা তার চাইতে বেশি মান ব্যবহার করুন।")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ca.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ca.js
deleted file mode 100644
index cb82b74d..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ca.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: CA (Catalan; català)
- */
-$.extend($.validator.messages, {
- required: "Aquest camp és obligatori.",
- remote: "Si us plau, omple aquest camp.",
- email: "Si us plau, escriu una adreça de correu-e vàlida",
- url: "Si us plau, escriu una URL vàlida.",
- date: "Si us plau, escriu una data vàlida.",
- dateISO: "Si us plau, escriu una data (ISO) vàlida.",
- number: "Si us plau, escriu un número enter vàlid.",
- digits: "Si us plau, escriu només dígits.",
- creditcard: "Si us plau, escriu un número de tarjeta vàlid.",
- equalTo: "Si us plau, escriu el mateix valor de nou.",
- extension: "Si us plau, escriu un valor amb una extensió acceptada.",
- maxlength: $.validator.format("Si us plau, no escriguis més de {0} caracters."),
- minlength: $.validator.format("Si us plau, no escriguis menys de {0} caracters."),
- rangelength: $.validator.format("Si us plau, escriu un valor entre {0} i {1} caracters."),
- range: $.validator.format("Si us plau, escriu un valor entre {0} i {1}."),
- max: $.validator.format("Si us plau, escriu un valor menor o igual a {0}."),
- min: $.validator.format("Si us plau, escriu un valor major o igual a {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ca.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ca.min.js
deleted file mode 100644
index 65cda540..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ca.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Aquest camp és obligatori.",remote:"Si us plau, omple aquest camp.",email:"Si us plau, escriu una adreça de correu-e vàlida",url:"Si us plau, escriu una URL vàlida.",date:"Si us plau, escriu una data vàlida.",dateISO:"Si us plau, escriu una data (ISO) vàlida.",number:"Si us plau, escriu un número enter vàlid.",digits:"Si us plau, escriu només dígits.",creditcard:"Si us plau, escriu un número de tarjeta vàlid.",equalTo:"Si us plau, escriu el mateix valor de nou.",extension:"Si us plau, escriu un valor amb una extensió acceptada.",maxlength:a.validator.format("Si us plau, no escriguis més de {0} caracters."),minlength:a.validator.format("Si us plau, no escriguis menys de {0} caracters."),rangelength:a.validator.format("Si us plau, escriu un valor entre {0} i {1} caracters."),range:a.validator.format("Si us plau, escriu un valor entre {0} i {1}."),max:a.validator.format("Si us plau, escriu un valor menor o igual a {0}."),min:a.validator.format("Si us plau, escriu un valor major o igual a {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_cs.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_cs.js
deleted file mode 100644
index 6c27e2b0..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_cs.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: CS (Czech; čeština, český jazyk)
- */
-$.extend($.validator.messages, {
- required: "Tento údaj je povinný.",
- remote: "Prosím, opravte tento údaj.",
- email: "Prosím, zadejte platný e-mail.",
- url: "Prosím, zadejte platné URL.",
- date: "Prosím, zadejte platné datum.",
- dateISO: "Prosím, zadejte platné datum (ISO).",
- number: "Prosím, zadejte číslo.",
- digits: "Prosím, zadávejte pouze číslice.",
- creditcard: "Prosím, zadejte číslo kreditní karty.",
- equalTo: "Prosím, zadejte znovu stejnou hodnotu.",
- extension: "Prosím, zadejte soubor se správnou příponou.",
- maxlength: $.validator.format("Prosím, zadejte nejvíce {0} znaků."),
- minlength: $.validator.format("Prosím, zadejte nejméně {0} znaků."),
- rangelength: $.validator.format("Prosím, zadejte od {0} do {1} znaků."),
- range: $.validator.format("Prosím, zadejte hodnotu od {0} do {1}."),
- max: $.validator.format("Prosím, zadejte hodnotu menší nebo rovnu {0}."),
- min: $.validator.format("Prosím, zadejte hodnotu větší nebo rovnu {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_cs.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_cs.min.js
deleted file mode 100644
index 54a8f847..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_cs.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Tento údaj je povinný.",remote:"Prosím, opravte tento údaj.",email:"Prosím, zadejte platný e-mail.",url:"Prosím, zadejte platné URL.",date:"Prosím, zadejte platné datum.",dateISO:"Prosím, zadejte platné datum (ISO).",number:"Prosím, zadejte číslo.",digits:"Prosím, zadávejte pouze číslice.",creditcard:"Prosím, zadejte číslo kreditní karty.",equalTo:"Prosím, zadejte znovu stejnou hodnotu.",extension:"Prosím, zadejte soubor se správnou příponou.",maxlength:a.validator.format("Prosím, zadejte nejvíce {0} znaků."),minlength:a.validator.format("Prosím, zadejte nejméně {0} znaků."),rangelength:a.validator.format("Prosím, zadejte od {0} do {1} znaků."),range:a.validator.format("Prosím, zadejte hodnotu od {0} do {1}."),max:a.validator.format("Prosím, zadejte hodnotu menší nebo rovnu {0}."),min:a.validator.format("Prosím, zadejte hodnotu větší nebo rovnu {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_da.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_da.js
deleted file mode 100644
index e862abad..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_da.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: DA (Danish; dansk)
- */
-$.extend($.validator.messages, {
- required: "Dette felt er påkrævet.",
- maxlength: $.validator.format("Indtast højst {0} tegn."),
- minlength: $.validator.format("Indtast mindst {0} tegn."),
- rangelength: $.validator.format("Indtast mindst {0} og højst {1} tegn."),
- email: "Indtast en gyldig email-adresse.",
- url: "Indtast en gyldig URL.",
- date: "Indtast en gyldig dato.",
- number: "Indtast et tal.",
- digits: "Indtast kun cifre.",
- equalTo: "Indtast den samme værdi igen.",
- range: $.validator.format("Angiv en værdi mellem {0} og {1}."),
- max: $.validator.format("Angiv en værdi der højst er {0}."),
- min: $.validator.format("Angiv en værdi der mindst er {0}."),
- creditcard: "Indtast et gyldigt kreditkortnummer."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_da.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_da.min.js
deleted file mode 100644
index 777c309e..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_da.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Dette felt er påkrævet.",maxlength:a.validator.format("Indtast højst {0} tegn."),minlength:a.validator.format("Indtast mindst {0} tegn."),rangelength:a.validator.format("Indtast mindst {0} og højst {1} tegn."),email:"Indtast en gyldig email-adresse.",url:"Indtast en gyldig URL.",date:"Indtast en gyldig dato.",number:"Indtast et tal.",digits:"Indtast kun cifre.",equalTo:"Indtast den samme værdi igen.",range:a.validator.format("Angiv en værdi mellem {0} og {1}."),max:a.validator.format("Angiv en værdi der højst er {0}."),min:a.validator.format("Angiv en værdi der mindst er {0}."),creditcard:"Indtast et gyldigt kreditkortnummer."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_de.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_de.js
deleted file mode 100644
index 7f5bc8fe..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_de.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: DE (German, Deutsch)
- */
-$.extend($.validator.messages, {
- required: "Dieses Feld ist ein Pflichtfeld.",
- maxlength: $.validator.format("Geben Sie bitte maximal {0} Zeichen ein."),
- minlength: $.validator.format("Geben Sie bitte mindestens {0} Zeichen ein."),
- rangelength: $.validator.format("Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein."),
- email: "Geben Sie bitte eine gültige E-Mail Adresse ein.",
- url: "Geben Sie bitte eine gültige URL ein.",
- date: "Bitte geben Sie ein gültiges Datum ein.",
- number: "Geben Sie bitte eine Nummer ein.",
- digits: "Geben Sie bitte nur Ziffern ein.",
- equalTo: "Bitte denselben Wert wiederholen.",
- range: $.validator.format("Geben Sie bitte einen Wert zwischen {0} und {1} ein."),
- max: $.validator.format("Geben Sie bitte einen Wert kleiner oder gleich {0} ein."),
- min: $.validator.format("Geben Sie bitte einen Wert größer oder gleich {0} ein."),
- creditcard: "Geben Sie bitte eine gültige Kreditkarten-Nummer ein."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_de.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_de.min.js
deleted file mode 100644
index 157dd571..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_de.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Dieses Feld ist ein Pflichtfeld.",maxlength:a.validator.format("Geben Sie bitte maximal {0} Zeichen ein."),minlength:a.validator.format("Geben Sie bitte mindestens {0} Zeichen ein."),rangelength:a.validator.format("Geben Sie bitte mindestens {0} und maximal {1} Zeichen ein."),email:"Geben Sie bitte eine gültige E-Mail Adresse ein.",url:"Geben Sie bitte eine gültige URL ein.",date:"Bitte geben Sie ein gültiges Datum ein.",number:"Geben Sie bitte eine Nummer ein.",digits:"Geben Sie bitte nur Ziffern ein.",equalTo:"Bitte denselben Wert wiederholen.",range:a.validator.format("Geben Sie bitte einen Wert zwischen {0} und {1} ein."),max:a.validator.format("Geben Sie bitte einen Wert kleiner oder gleich {0} ein."),min:a.validator.format("Geben Sie bitte einen Wert größer oder gleich {0} ein."),creditcard:"Geben Sie bitte eine gültige Kreditkarten-Nummer ein."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_el.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_el.js
deleted file mode 100644
index 5758f56f..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_el.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: EL (Greek; ελληνικά)
- */
-$.extend($.validator.messages, {
- required: "Αυτό το πεδίο είναι υποχρεωτικό.",
- remote: "Παρακαλώ διορθώστε αυτό το πεδίο.",
- email: "Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.",
- url: "Παρακαλώ εισάγετε ένα έγκυρο URL.",
- date: "Παρακαλώ εισάγετε μια έγκυρη ημερομηνία.",
- dateISO: "Παρακαλώ εισάγετε μια έγκυρη ημερομηνία (ISO).",
- number: "Παρακαλώ εισάγετε έναν έγκυρο αριθμό.",
- digits: "Παρακαλώ εισάγετε μόνο αριθμητικά ψηφία.",
- creditcard: "Παρακαλώ εισάγετε έναν έγκυρο αριθμό πιστωτικής κάρτας.",
- equalTo: "Παρακαλώ εισάγετε την ίδια τιμή ξανά.",
- extension: "Παρακαλώ εισάγετε μια τιμή με έγκυρη επέκταση αρχείου.",
- maxlength: $.validator.format("Παρακαλώ εισάγετε μέχρι και {0} χαρακτήρες."),
- minlength: $.validator.format("Παρακαλώ εισάγετε τουλάχιστον {0} χαρακτήρες."),
- rangelength: $.validator.format("Παρακαλώ εισάγετε μια τιμή με μήκος μεταξύ {0} και {1} χαρακτήρων."),
- range: $.validator.format("Παρακαλώ εισάγετε μια τιμή μεταξύ {0} και {1}."),
- max: $.validator.format("Παρακαλώ εισάγετε μια τιμή μικρότερη ή ίση του {0}."),
- min: $.validator.format("Παρακαλώ εισάγετε μια τιμή μεγαλύτερη ή ίση του {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_el.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_el.min.js
deleted file mode 100644
index e41b9870..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_el.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Αυτό το πεδίο είναι υποχρεωτικό.",remote:"Παρακαλώ διορθώστε αυτό το πεδίο.",email:"Παρακαλώ εισάγετε μια έγκυρη διεύθυνση email.",url:"Παρακαλώ εισάγετε ένα έγκυρο URL.",date:"Παρακαλώ εισάγετε μια έγκυρη ημερομηνία.",dateISO:"Παρακαλώ εισάγετε μια έγκυρη ημερομηνία (ISO).",number:"Παρακαλώ εισάγετε έναν έγκυρο αριθμό.",digits:"Παρακαλώ εισάγετε μόνο αριθμητικά ψηφία.",creditcard:"Παρακαλώ εισάγετε έναν έγκυρο αριθμό πιστωτικής κάρτας.",equalTo:"Παρακαλώ εισάγετε την ίδια τιμή ξανά.",extension:"Παρακαλώ εισάγετε μια τιμή με έγκυρη επέκταση αρχείου.",maxlength:a.validator.format("Παρακαλώ εισάγετε μέχρι και {0} χαρακτήρες."),minlength:a.validator.format("Παρακαλώ εισάγετε τουλάχιστον {0} χαρακτήρες."),rangelength:a.validator.format("Παρακαλώ εισάγετε μια τιμή με μήκος μεταξύ {0} και {1} χαρακτήρων."),range:a.validator.format("Παρακαλώ εισάγετε μια τιμή μεταξύ {0} και {1}."),max:a.validator.format("Παρακαλώ εισάγετε μια τιμή μικρότερη ή ίση του {0}."),min:a.validator.format("Παρακαλώ εισάγετε μια τιμή μεγαλύτερη ή ίση του {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es.js
deleted file mode 100644
index bf37c17a..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es.js
+++ /dev/null
@@ -1,36 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: ES (Spanish; Español)
- */
-$.extend($.validator.messages, {
- required: "Este campo es obligatorio.",
- remote: "Por favor, rellena este campo.",
- email: "Por favor, escribe una dirección de correo válida.",
- url: "Por favor, escribe una URL válida.",
- date: "Por favor, escribe una fecha válida.",
- dateISO: "Por favor, escribe una fecha (ISO) válida.",
- number: "Por favor, escribe un número válido.",
- digits: "Por favor, escribe sólo dígitos.",
- creditcard: "Por favor, escribe un número de tarjeta válido.",
- equalTo: "Por favor, escribe el mismo valor de nuevo.",
- extension: "Por favor, escribe un valor con una extensión aceptada.",
- maxlength: $.validator.format("Por favor, no escribas más de {0} caracteres."),
- minlength: $.validator.format("Por favor, no escribas menos de {0} caracteres."),
- rangelength: $.validator.format("Por favor, escribe un valor entre {0} y {1} caracteres."),
- range: $.validator.format("Por favor, escribe un valor entre {0} y {1}."),
- max: $.validator.format("Por favor, escribe un valor menor o igual a {0}."),
- min: $.validator.format("Por favor, escribe un valor mayor o igual a {0}."),
- nifES: "Por favor, escribe un NIF válido.",
- nieES: "Por favor, escribe un NIE válido.",
- cifES: "Por favor, escribe un CIF válido."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es.min.js
deleted file mode 100644
index c735dd99..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Este campo es obligatorio.",remote:"Por favor, rellena este campo.",email:"Por favor, escribe una dirección de correo válida.",url:"Por favor, escribe una URL válida.",date:"Por favor, escribe una fecha válida.",dateISO:"Por favor, escribe una fecha (ISO) válida.",number:"Por favor, escribe un número válido.",digits:"Por favor, escribe sólo dígitos.",creditcard:"Por favor, escribe un número de tarjeta válido.",equalTo:"Por favor, escribe el mismo valor de nuevo.",extension:"Por favor, escribe un valor con una extensión aceptada.",maxlength:a.validator.format("Por favor, no escribas más de {0} caracteres."),minlength:a.validator.format("Por favor, no escribas menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escribe un valor entre {0} y {1} caracteres."),range:a.validator.format("Por favor, escribe un valor entre {0} y {1}."),max:a.validator.format("Por favor, escribe un valor menor o igual a {0}."),min:a.validator.format("Por favor, escribe un valor mayor o igual a {0}."),nifES:"Por favor, escribe un NIF válido.",nieES:"Por favor, escribe un NIE válido.",cifES:"Por favor, escribe un CIF válido."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_AR.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_AR.js
deleted file mode 100644
index c7279e47..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_AR.js
+++ /dev/null
@@ -1,37 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: ES (Spanish; Español)
- * Region: AR (Argentina)
- */
-$.extend($.validator.messages, {
- required: "Este campo es obligatorio.",
- remote: "Por favor, completá este campo.",
- email: "Por favor, escribí una dirección de correo válida.",
- url: "Por favor, escribí una URL válida.",
- date: "Por favor, escribí una fecha válida.",
- dateISO: "Por favor, escribí una fecha (ISO) válida.",
- number: "Por favor, escribí un número entero válido.",
- digits: "Por favor, escribí sólo dígitos.",
- creditcard: "Por favor, escribí un número de tarjeta válido.",
- equalTo: "Por favor, escribí el mismo valor de nuevo.",
- extension: "Por favor, escribí un valor con una extensión aceptada.",
- maxlength: $.validator.format("Por favor, no escribas más de {0} caracteres."),
- minlength: $.validator.format("Por favor, no escribas menos de {0} caracteres."),
- rangelength: $.validator.format("Por favor, escribí un valor entre {0} y {1} caracteres."),
- range: $.validator.format("Por favor, escribí un valor entre {0} y {1}."),
- max: $.validator.format("Por favor, escribí un valor menor o igual a {0}."),
- min: $.validator.format("Por favor, escribí un valor mayor o igual a {0}."),
- nifES: "Por favor, escribí un NIF válido.",
- nieES: "Por favor, escribí un NIE válido.",
- cifES: "Por favor, escribí un CIF válido."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_AR.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_AR.min.js
deleted file mode 100644
index 0af43952..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_AR.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Este campo es obligatorio.",remote:"Por favor, completá este campo.",email:"Por favor, escribí una dirección de correo válida.",url:"Por favor, escribí una URL válida.",date:"Por favor, escribí una fecha válida.",dateISO:"Por favor, escribí una fecha (ISO) válida.",number:"Por favor, escribí un número entero válido.",digits:"Por favor, escribí sólo dígitos.",creditcard:"Por favor, escribí un número de tarjeta válido.",equalTo:"Por favor, escribí el mismo valor de nuevo.",extension:"Por favor, escribí un valor con una extensión aceptada.",maxlength:a.validator.format("Por favor, no escribas más de {0} caracteres."),minlength:a.validator.format("Por favor, no escribas menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escribí un valor entre {0} y {1} caracteres."),range:a.validator.format("Por favor, escribí un valor entre {0} y {1}."),max:a.validator.format("Por favor, escribí un valor menor o igual a {0}."),min:a.validator.format("Por favor, escribí un valor mayor o igual a {0}."),nifES:"Por favor, escribí un NIF válido.",nieES:"Por favor, escribí un NIE válido.",cifES:"Por favor, escribí un CIF válido."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_PE.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_PE.js
deleted file mode 100644
index 2879e6f2..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_PE.js
+++ /dev/null
@@ -1,37 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: ES (Spanish; Español)
- * Region: PE (Perú)
- */
-$.extend($.validator.messages, {
- required: "Este campo es obligatorio.",
- remote: "Por favor, llene este campo.",
- email: "Por favor, escriba un correo electrónico válido.",
- url: "Por favor, escriba una URL válida.",
- date: "Por favor, escriba una fecha válida.",
- dateISO: "Por favor, escriba una fecha (ISO) válida.",
- number: "Por favor, escriba un número válido.",
- digits: "Por favor, escriba sólo dígitos.",
- creditcard: "Por favor, escriba un número de tarjeta válido.",
- equalTo: "Por favor, escriba el mismo valor de nuevo.",
- extension: "Por favor, escriba un valor con una extensión permitida.",
- maxlength: $.validator.format("Por favor, no escriba más de {0} caracteres."),
- minlength: $.validator.format("Por favor, no escriba menos de {0} caracteres."),
- rangelength: $.validator.format("Por favor, escriba un valor entre {0} y {1} caracteres."),
- range: $.validator.format("Por favor, escriba un valor entre {0} y {1}."),
- max: $.validator.format("Por favor, escriba un valor menor o igual a {0}."),
- min: $.validator.format("Por favor, escriba un valor mayor o igual a {0}."),
- nifES: "Por favor, escriba un NIF válido.",
- nieES: "Por favor, escriba un NIE válido.",
- cifES: "Por favor, escriba un CIF válido."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_PE.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_PE.min.js
deleted file mode 100644
index 2d8061f0..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_es_PE.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Este campo es obligatorio.",remote:"Por favor, llene este campo.",email:"Por favor, escriba un correo electrónico válido.",url:"Por favor, escriba una URL válida.",date:"Por favor, escriba una fecha válida.",dateISO:"Por favor, escriba una fecha (ISO) válida.",number:"Por favor, escriba un número válido.",digits:"Por favor, escriba sólo dígitos.",creditcard:"Por favor, escriba un número de tarjeta válido.",equalTo:"Por favor, escriba el mismo valor de nuevo.",extension:"Por favor, escriba un valor con una extensión permitida.",maxlength:a.validator.format("Por favor, no escriba más de {0} caracteres."),minlength:a.validator.format("Por favor, no escriba menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escriba un valor entre {0} y {1} caracteres."),range:a.validator.format("Por favor, escriba un valor entre {0} y {1}."),max:a.validator.format("Por favor, escriba un valor menor o igual a {0}."),min:a.validator.format("Por favor, escriba un valor mayor o igual a {0}."),nifES:"Por favor, escriba un NIF válido.",nieES:"Por favor, escriba un NIE válido.",cifES:"Por favor, escriba un CIF válido."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_et.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_et.js
deleted file mode 100644
index 0dd93cd2..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_et.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: ET (Estonian; eesti, eesti keel)
- */
-$.extend($.validator.messages, {
- required: "See väli peab olema täidetud.",
- maxlength: $.validator.format("Palun sisestage vähem kui {0} tähemärki."),
- minlength: $.validator.format("Palun sisestage vähemalt {0} tähemärki."),
- rangelength: $.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1} tähemärki."),
- email: "Palun sisestage korrektne e-maili aadress.",
- url: "Palun sisestage korrektne URL.",
- date: "Palun sisestage korrektne kuupäev.",
- dateISO: "Palun sisestage korrektne kuupäev (YYYY-MM-DD).",
- number: "Palun sisestage korrektne number.",
- digits: "Palun sisestage ainult numbreid.",
- equalTo: "Palun sisestage sama väärtus uuesti.",
- range: $.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1}."),
- max: $.validator.format("Palun sisestage väärtus, mis on väiksem või võrdne arvuga {0}."),
- min: $.validator.format("Palun sisestage väärtus, mis on suurem või võrdne arvuga {0}."),
- creditcard: "Palun sisestage korrektne krediitkaardi number."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_et.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_et.min.js
deleted file mode 100644
index c99089fd..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_et.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"See väli peab olema täidetud.",maxlength:a.validator.format("Palun sisestage vähem kui {0} tähemärki."),minlength:a.validator.format("Palun sisestage vähemalt {0} tähemärki."),rangelength:a.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1} tähemärki."),email:"Palun sisestage korrektne e-maili aadress.",url:"Palun sisestage korrektne URL.",date:"Palun sisestage korrektne kuupäev.",dateISO:"Palun sisestage korrektne kuupäev (YYYY-MM-DD).",number:"Palun sisestage korrektne number.",digits:"Palun sisestage ainult numbreid.",equalTo:"Palun sisestage sama väärtus uuesti.",range:a.validator.format("Palun sisestage väärtus vahemikus {0} kuni {1}."),max:a.validator.format("Palun sisestage väärtus, mis on väiksem või võrdne arvuga {0}."),min:a.validator.format("Palun sisestage väärtus, mis on suurem või võrdne arvuga {0}."),creditcard:"Palun sisestage korrektne krediitkaardi number."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_eu.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_eu.js
deleted file mode 100644
index a9b07773..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_eu.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: EU (Basque; euskara, euskera)
- */
-$.extend($.validator.messages, {
- required: "Eremu hau beharrezkoa da.",
- remote: "Mesedez, bete eremu hau.",
- email: "Mesedez, idatzi baliozko posta helbide bat.",
- url: "Mesedez, idatzi baliozko URL bat.",
- date: "Mesedez, idatzi baliozko data bat.",
- dateISO: "Mesedez, idatzi baliozko (ISO) data bat.",
- number: "Mesedez, idatzi baliozko zenbaki oso bat.",
- digits: "Mesedez, idatzi digituak soilik.",
- creditcard: "Mesedez, idatzi baliozko txartel zenbaki bat.",
- equalTo: "Mesedez, idatzi berdina berriro ere.",
- extension: "Mesedez, idatzi onartutako luzapena duen balio bat.",
- maxlength: $.validator.format("Mesedez, ez idatzi {0} karaktere baino gehiago."),
- minlength: $.validator.format("Mesedez, ez idatzi {0} karaktere baino gutxiago."),
- rangelength: $.validator.format("Mesedez, idatzi {0} eta {1} karaktere arteko balio bat."),
- range: $.validator.format("Mesedez, idatzi {0} eta {1} arteko balio bat."),
- max: $.validator.format("Mesedez, idatzi {0} edo txikiagoa den balio bat."),
- min: $.validator.format("Mesedez, idatzi {0} edo handiagoa den balio bat.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_eu.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_eu.min.js
deleted file mode 100644
index 69eeb312..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_eu.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Eremu hau beharrezkoa da.",remote:"Mesedez, bete eremu hau.",email:"Mesedez, idatzi baliozko posta helbide bat.",url:"Mesedez, idatzi baliozko URL bat.",date:"Mesedez, idatzi baliozko data bat.",dateISO:"Mesedez, idatzi baliozko (ISO) data bat.",number:"Mesedez, idatzi baliozko zenbaki oso bat.",digits:"Mesedez, idatzi digituak soilik.",creditcard:"Mesedez, idatzi baliozko txartel zenbaki bat.",equalTo:"Mesedez, idatzi berdina berriro ere.",extension:"Mesedez, idatzi onartutako luzapena duen balio bat.",maxlength:a.validator.format("Mesedez, ez idatzi {0} karaktere baino gehiago."),minlength:a.validator.format("Mesedez, ez idatzi {0} karaktere baino gutxiago."),rangelength:a.validator.format("Mesedez, idatzi {0} eta {1} karaktere arteko balio bat."),range:a.validator.format("Mesedez, idatzi {0} eta {1} arteko balio bat."),max:a.validator.format("Mesedez, idatzi {0} edo txikiagoa den balio bat."),min:a.validator.format("Mesedez, idatzi {0} edo handiagoa den balio bat.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fa.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fa.js
deleted file mode 100644
index eb7d3367..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fa.js
+++ /dev/null
@@ -1,36 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: FA (Persian; فارسی)
- */
-$.extend($.validator.messages, {
- required: "تکمیل این فیلد اجباری است.",
- remote: "لطفا این فیلد را تصحیح کنید.",
- email: ".لطفا یک ایمیل صحیح وارد کنید",
- url: "لطفا آدرس صحیح وارد کنید.",
- date: "لطفا یک تاریخ صحیح وارد کنید",
- dateFA: "لطفا یک تاریخ صحیح وارد کنید",
- dateISO: "لطفا تاریخ صحیح وارد کنید (ISO).",
- number: "لطفا عدد صحیح وارد کنید.",
- digits: "لطفا تنها رقم وارد کنید",
- creditcard: "لطفا کریدیت کارت صحیح وارد کنید.",
- equalTo: "لطفا مقدار برابری وارد کنید",
- extension: "لطفا مقداری وارد کنید که ",
- maxlength: $.validator.format("لطفا بیشتر از {0} حرف وارد نکنید."),
- minlength: $.validator.format("لطفا کمتر از {0} حرف وارد نکنید."),
- rangelength: $.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),
- range: $.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),
- max: $.validator.format("لطفا مقداری کمتر از {0} حرف وارد کنید."),
- min: $.validator.format("لطفا مقداری بیشتر از {0} حرف وارد کنید."),
- minWords: $.validator.format("لطفا حداقل {0} کلمه وارد کنید."),
- maxWords: $.validator.format("لطفا حداکثر {0} کلمه وارد کنید.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fa.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fa.min.js
deleted file mode 100644
index be2bc135..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fa.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"تکمیل این فیلد اجباری است.",remote:"لطفا این فیلد را تصحیح کنید.",email:".لطفا یک ایمیل صحیح وارد کنید",url:"لطفا آدرس صحیح وارد کنید.",date:"لطفا یک تاریخ صحیح وارد کنید",dateFA:"لطفا یک تاریخ صحیح وارد کنید",dateISO:"لطفا تاریخ صحیح وارد کنید (ISO).",number:"لطفا عدد صحیح وارد کنید.",digits:"لطفا تنها رقم وارد کنید",creditcard:"لطفا کریدیت کارت صحیح وارد کنید.",equalTo:"لطفا مقدار برابری وارد کنید",extension:"لطفا مقداری وارد کنید که ",maxlength:a.validator.format("لطفا بیشتر از {0} حرف وارد نکنید."),minlength:a.validator.format("لطفا کمتر از {0} حرف وارد نکنید."),rangelength:a.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),range:a.validator.format("لطفا مقداری بین {0} تا {1} حرف وارد کنید."),max:a.validator.format("لطفا مقداری کمتر از {0} حرف وارد کنید."),min:a.validator.format("لطفا مقداری بیشتر از {0} حرف وارد کنید."),minWords:a.validator.format("لطفا حداقل {0} کلمه وارد کنید."),maxWords:a.validator.format("لطفا حداکثر {0} کلمه وارد کنید.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fi.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fi.js
deleted file mode 100644
index b2964c4e..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fi.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: FI (Finnish; suomi, suomen kieli)
- */
-$.extend($.validator.messages, {
- required: "T&auml;m&auml; kentt&auml; on pakollinen.",
- email: "Sy&ouml;t&auml; oikea s&auml;hk&ouml;postiosoite.",
- url: "Sy&ouml;t&auml; oikea URL-osoite.",
- date: "Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml;.",
- dateISO: "Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml; muodossa VVVV-KK-PP.",
- number: "Sy&ouml;t&auml; luku.",
- creditcard: "Sy&ouml;t&auml; voimassa oleva luottokorttinumero.",
- digits: "Sy&ouml;t&auml; pelk&auml;st&auml;&auml;n numeroita.",
- equalTo: "Sy&ouml;t&auml; sama arvo uudestaan.",
- maxlength: $.validator.format("Voit sy&ouml;tt&auml;&auml; enint&auml;&auml;n {0} merkki&auml;."),
- minlength: $.validator.format("V&auml;hint&auml;&auml;n {0} merkki&auml;."),
- rangelength: $.validator.format("Sy&ouml;t&auml; v&auml;hint&auml;&auml;n {0} ja enint&auml;&auml;n {1} merkki&auml;."),
- range: $.validator.format("Sy&ouml;t&auml; arvo v&auml;lilt&auml; {0}&ndash;{1}."),
- max: $.validator.format("Sy&ouml;t&auml; arvo, joka on enint&auml;&auml;n {0}."),
- min: $.validator.format("Sy&ouml;t&auml; arvo, joka on v&auml;hint&auml;&auml;n {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fi.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fi.min.js
deleted file mode 100644
index cafd522a..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fi.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"T&auml;m&auml; kentt&auml; on pakollinen.",email:"Sy&ouml;t&auml; oikea s&auml;hk&ouml;postiosoite.",url:"Sy&ouml;t&auml; oikea URL-osoite.",date:"Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml;.",dateISO:"Sy&ouml;t&auml; oikea p&auml;iv&auml;m&auml;&auml;r&auml; muodossa VVVV-KK-PP.",number:"Sy&ouml;t&auml; luku.",creditcard:"Sy&ouml;t&auml; voimassa oleva luottokorttinumero.",digits:"Sy&ouml;t&auml; pelk&auml;st&auml;&auml;n numeroita.",equalTo:"Sy&ouml;t&auml; sama arvo uudestaan.",maxlength:a.validator.format("Voit sy&ouml;tt&auml;&auml; enint&auml;&auml;n {0} merkki&auml;."),minlength:a.validator.format("V&auml;hint&auml;&auml;n {0} merkki&auml;."),rangelength:a.validator.format("Sy&ouml;t&auml; v&auml;hint&auml;&auml;n {0} ja enint&auml;&auml;n {1} merkki&auml;."),range:a.validator.format("Sy&ouml;t&auml; arvo v&auml;lilt&auml; {0}&ndash;{1}."),max:a.validator.format("Sy&ouml;t&auml; arvo, joka on enint&auml;&auml;n {0}."),min:a.validator.format("Sy&ouml;t&auml; arvo, joka on v&auml;hint&auml;&auml;n {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fr.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fr.js
deleted file mode 100644
index d465538d..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fr.js
+++ /dev/null
@@ -1,59 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: FR (French; français)
- */
-$.extend($.validator.messages, {
- required: "Ce champ est obligatoire.",
- remote: "Veuillez corriger ce champ.",
- email: "Veuillez fournir une adresse électronique valide.",
- url: "Veuillez fournir une adresse URL valide.",
- date: "Veuillez fournir une date valide.",
- dateISO: "Veuillez fournir une date valide (ISO).",
- number: "Veuillez fournir un numéro valide.",
- digits: "Veuillez fournir seulement des chiffres.",
- creditcard: "Veuillez fournir un numéro de carte de crédit valide.",
- equalTo: "Veuillez fournir encore la même valeur.",
- extension: "Veuillez fournir une valeur avec une extension valide.",
- maxlength: $.validator.format("Veuillez fournir au plus {0} caractères."),
- minlength: $.validator.format("Veuillez fournir au moins {0} caractères."),
- rangelength: $.validator.format("Veuillez fournir une valeur qui contient entre {0} et {1} caractères."),
- range: $.validator.format("Veuillez fournir une valeur entre {0} et {1}."),
- max: $.validator.format("Veuillez fournir une valeur inférieure ou égale à {0}."),
- min: $.validator.format("Veuillez fournir une valeur supérieure ou égale à {0}."),
- maxWords: $.validator.format("Veuillez fournir au plus {0} mots."),
- minWords: $.validator.format("Veuillez fournir au moins {0} mots."),
- rangeWords: $.validator.format("Veuillez fournir entre {0} et {1} mots."),
- letterswithbasicpunc: "Veuillez fournir seulement des lettres et des signes de ponctuation.",
- alphanumeric: "Veuillez fournir seulement des lettres, nombres, espaces et soulignages.",
- lettersonly: "Veuillez fournir seulement des lettres.",
- nowhitespace: "Veuillez ne pas inscrire d'espaces blancs.",
- ziprange: "Veuillez fournir un code postal entre 902xx-xxxx et 905-xx-xxxx.",
- integer: "Veuillez fournir un nombre non décimal qui est positif ou négatif.",
- vinUS: "Veuillez fournir un numéro d'identification du véhicule (VIN).",
- dateITA: "Veuillez fournir une date valide.",
- time: "Veuillez fournir une heure valide entre 00:00 et 23:59.",
- phoneUS: "Veuillez fournir un numéro de téléphone valide.",
- phoneUK: "Veuillez fournir un numéro de téléphone valide.",
- mobileUK: "Veuillez fournir un numéro de téléphone mobile valide.",
- strippedminlength: $.validator.format("Veuillez fournir au moins {0} caractères."),
- email2: "Veuillez fournir une adresse électronique valide.",
- url2: "Veuillez fournir une adresse URL valide.",
- creditcardtypes: "Veuillez fournir un numéro de carte de crédit valide.",
- ipv4: "Veuillez fournir une adresse IP v4 valide.",
- ipv6: "Veuillez fournir une adresse IP v6 valide.",
- require_from_group: "Veuillez fournir au moins {0} de ces champs.",
- nifES: "Veuillez fournir un numéro NIF valide.",
- nieES: "Veuillez fournir un numéro NIE valide.",
- cifES: "Veuillez fournir un numéro CIF valide.",
- postalCodeCA: "Veuillez fournir un code postal valide."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fr.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fr.min.js
deleted file mode 100644
index b7ef93e3..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_fr.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Ce champ est obligatoire.",remote:"Veuillez corriger ce champ.",email:"Veuillez fournir une adresse électronique valide.",url:"Veuillez fournir une adresse URL valide.",date:"Veuillez fournir une date valide.",dateISO:"Veuillez fournir une date valide (ISO).",number:"Veuillez fournir un numéro valide.",digits:"Veuillez fournir seulement des chiffres.",creditcard:"Veuillez fournir un numéro de carte de crédit valide.",equalTo:"Veuillez fournir encore la même valeur.",extension:"Veuillez fournir une valeur avec une extension valide.",maxlength:a.validator.format("Veuillez fournir au plus {0} caractères."),minlength:a.validator.format("Veuillez fournir au moins {0} caractères."),rangelength:a.validator.format("Veuillez fournir une valeur qui contient entre {0} et {1} caractères."),range:a.validator.format("Veuillez fournir une valeur entre {0} et {1}."),max:a.validator.format("Veuillez fournir une valeur inférieure ou égale à {0}."),min:a.validator.format("Veuillez fournir une valeur supérieure ou égale à {0}."),maxWords:a.validator.format("Veuillez fournir au plus {0} mots."),minWords:a.validator.format("Veuillez fournir au moins {0} mots."),rangeWords:a.validator.format("Veuillez fournir entre {0} et {1} mots."),letterswithbasicpunc:"Veuillez fournir seulement des lettres et des signes de ponctuation.",alphanumeric:"Veuillez fournir seulement des lettres, nombres, espaces et soulignages.",lettersonly:"Veuillez fournir seulement des lettres.",nowhitespace:"Veuillez ne pas inscrire d'espaces blancs.",ziprange:"Veuillez fournir un code postal entre 902xx-xxxx et 905-xx-xxxx.",integer:"Veuillez fournir un nombre non décimal qui est positif ou négatif.",vinUS:"Veuillez fournir un numéro d'identification du véhicule (VIN).",dateITA:"Veuillez fournir une date valide.",time:"Veuillez fournir une heure valide entre 00:00 et 23:59.",phoneUS:"Veuillez fournir un numéro de téléphone valide.",phoneUK:"Veuillez fournir un numéro de téléphone valide.",mobileUK:"Veuillez fournir un numéro de téléphone mobile valide.",strippedminlength:a.validator.format("Veuillez fournir au moins {0} caractères."),email2:"Veuillez fournir une adresse électronique valide.",url2:"Veuillez fournir une adresse URL valide.",creditcardtypes:"Veuillez fournir un numéro de carte de crédit valide.",ipv4:"Veuillez fournir une adresse IP v4 valide.",ipv6:"Veuillez fournir une adresse IP v6 valide.",require_from_group:"Veuillez fournir au moins {0} de ces champs.",nifES:"Veuillez fournir un numéro NIF valide.",nieES:"Veuillez fournir un numéro NIE valide.",cifES:"Veuillez fournir un numéro CIF valide.",postalCodeCA:"Veuillez fournir un code postal valide."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ge.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ge.js
deleted file mode 100644
index dd84881e..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ge.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/**
- * @author @tatocaster <kutaliatato@gmail.com>
- * Translated default messages for the jQuery validation plugin.
- * Locale: GE (Georgian; ქართული)
- */
-$.extend($.validator.messages, {
- required: "ეს ველი სავალდებულოა",
- remote: "გთხოვთ შეასწოროთ.",
- email: "გთხოვთ შეიყვანოთ სწორი ფორმატით.",
- url: "გთხოვთ შეიყვანოთ სწორი ფორმატით.",
- date: "გთხოვთ შეიყვანოთ სწორი თარიღი.",
- dateISO: "გთხოვთ შეიყვანოთ სწორი ფორმატით ( ISO ).",
- number: "გთხოვთ შეიყვანოთ რიცხვი.",
- digits: "დაშვებულია მხოლოდ ციფრები.",
- creditcard: "გთხოვთ შეიყვანოთ სწორი ფორმატის ბარათის კოდი.",
- equalTo: "გთხოვთ შეიყვანოთ იგივე მნიშვნელობა.",
- maxlength: $.validator.format( "გთხოვთ შეიყვანოთ არა უმეტეს {0} სიმბოლოსი." ),
- minlength: $.validator.format( "შეიყვანეთ მინიმუმ {0} სიმბოლო." ),
- rangelength: $.validator.format( "გთხოვთ შეიყვანოთ {0} -დან {1} -მდე რაოდენობის სიმბოლოები." ),
- range: $.validator.format( "შეიყვანეთ {0} -სა {1} -ს შორის." ),
- max: $.validator.format( "გთხოვთ შეიყვანოთ მნიშვნელობა ნაკლები ან ტოლი {0} -ს." ),
- min: $.validator.format( "გთხოვთ შეიყვანოთ მნიშვნელობა მეტი ან ტოლი {0} -ს." )
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ge.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ge.min.js
deleted file mode 100644
index d3459cf9..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ge.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"ეს ველი სავალდებულოა",remote:"გთხოვთ შეასწოროთ.",email:"გთხოვთ შეიყვანოთ სწორი ფორმატით.",url:"გთხოვთ შეიყვანოთ სწორი ფორმატით.",date:"გთხოვთ შეიყვანოთ სწორი თარიღი.",dateISO:"გთხოვთ შეიყვანოთ სწორი ფორმატით ( ISO ).",number:"გთხოვთ შეიყვანოთ რიცხვი.",digits:"დაშვებულია მხოლოდ ციფრები.",creditcard:"გთხოვთ შეიყვანოთ სწორი ფორმატის ბარათის კოდი.",equalTo:"გთხოვთ შეიყვანოთ იგივე მნიშვნელობა.",maxlength:a.validator.format("გთხოვთ შეიყვანოთ არა უმეტეს {0} სიმბოლოსი."),minlength:a.validator.format("შეიყვანეთ მინიმუმ {0} სიმბოლო."),rangelength:a.validator.format("გთხოვთ შეიყვანოთ {0} -დან {1} -მდე რაოდენობის სიმბოლოები."),range:a.validator.format("შეიყვანეთ {0} -სა {1} -ს შორის."),max:a.validator.format("გთხოვთ შეიყვანოთ მნიშვნელობა ნაკლები ან ტოლი {0} -ს."),min:a.validator.format("გთხოვთ შეიყვანოთ მნიშვნელობა მეტი ან ტოლი {0} -ს.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_gl.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_gl.js
deleted file mode 100644
index a36f6090..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_gl.js
+++ /dev/null
@@ -1,38 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: GL (Galician; Galego)
- */
-(function($) {
- $.extend($.validator.messages, {
- required: "Este campo é obrigatorio.",
- remote: "Por favor, cubre este campo.",
- email: "Por favor, escribe unha dirección de correo válida.",
- url: "Por favor, escribe unha URL válida.",
- date: "Por favor, escribe unha data válida.",
- dateISO: "Por favor, escribe unha data (ISO) válida.",
- number: "Por favor, escribe un número válido.",
- digits: "Por favor, escribe só díxitos.",
- creditcard: "Por favor, escribe un número de tarxeta válido.",
- equalTo: "Por favor, escribe o mesmo valor de novo.",
- extension: "Por favor, escribe un valor cunha extensión aceptada.",
- maxlength: $.validator.format("Por favor, non escribas máis de {0} caracteres."),
- minlength: $.validator.format("Por favor, non escribas menos de {0} caracteres."),
- rangelength: $.validator.format("Por favor, escribe un valor entre {0} e {1} caracteres."),
- range: $.validator.format("Por favor, escribe un valor entre {0} e {1}."),
- max: $.validator.format("Por favor, escribe un valor menor ou igual a {0}."),
- min: $.validator.format("Por favor, escribe un valor maior ou igual a {0}."),
- nifES: "Por favor, escribe un NIF válido.",
- nieES: "Por favor, escribe un NIE válido.",
- cifES: "Por favor, escribe un CIF válido."
- });
-}(jQuery));
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_gl.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_gl.min.js
deleted file mode 100644
index f34f3015..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_gl.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){!function(a){a.extend(a.validator.messages,{required:"Este campo é obrigatorio.",remote:"Por favor, cubre este campo.",email:"Por favor, escribe unha dirección de correo válida.",url:"Por favor, escribe unha URL válida.",date:"Por favor, escribe unha data válida.",dateISO:"Por favor, escribe unha data (ISO) válida.",number:"Por favor, escribe un número válido.",digits:"Por favor, escribe só díxitos.",creditcard:"Por favor, escribe un número de tarxeta válido.",equalTo:"Por favor, escribe o mesmo valor de novo.",extension:"Por favor, escribe un valor cunha extensión aceptada.",maxlength:a.validator.format("Por favor, non escribas máis de {0} caracteres."),minlength:a.validator.format("Por favor, non escribas menos de {0} caracteres."),rangelength:a.validator.format("Por favor, escribe un valor entre {0} e {1} caracteres."),range:a.validator.format("Por favor, escribe un valor entre {0} e {1}."),max:a.validator.format("Por favor, escribe un valor menor ou igual a {0}."),min:a.validator.format("Por favor, escribe un valor maior ou igual a {0}."),nifES:"Por favor, escribe un NIF válido.",nieES:"Por favor, escribe un NIE válido.",cifES:"Por favor, escribe un CIF válido."})}(jQuery)}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_he.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_he.js
deleted file mode 100644
index b50beb0e..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_he.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: HE (Hebrew; עברית)
- */
-$.extend($.validator.messages, {
- required: "השדה הזה הינו שדה חובה",
- remote: "נא לתקן שדה זה",
- email: "נא למלא כתובת דוא\"ל חוקית",
- url: "נא למלא כתובת אינטרנט חוקית",
- date: "נא למלא תאריך חוקי",
- dateISO: "נא למלא תאריך חוקי (ISO)",
- number: "נא למלא מספר",
- digits: "נא למלא רק מספרים",
- creditcard: "נא למלא מספר כרטיס אשראי חוקי",
- equalTo: "נא למלא את אותו ערך שוב",
- extension: "נא למלא ערך עם סיומת חוקית",
- maxlength: $.validator.format(".נא לא למלא יותר מ- {0} תווים"),
- minlength: $.validator.format("נא למלא לפחות {0} תווים"),
- rangelength: $.validator.format("נא למלא ערך בין {0} ל- {1} תווים"),
- range: $.validator.format("נא למלא ערך בין {0} ל- {1}"),
- max: $.validator.format("נא למלא ערך קטן או שווה ל- {0}"),
- min: $.validator.format("נא למלא ערך גדול או שווה ל- {0}")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_he.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_he.min.js
deleted file mode 100644
index d9e954fa..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_he.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"השדה הזה הינו שדה חובה",remote:"נא לתקן שדה זה",email:'נא למלא כתובת דוא"ל חוקית',url:"נא למלא כתובת אינטרנט חוקית",date:"נא למלא תאריך חוקי",dateISO:"נא למלא תאריך חוקי (ISO)",number:"נא למלא מספר",digits:"נא למלא רק מספרים",creditcard:"נא למלא מספר כרטיס אשראי חוקי",equalTo:"נא למלא את אותו ערך שוב",extension:"נא למלא ערך עם סיומת חוקית",maxlength:a.validator.format(".נא לא למלא יותר מ- {0} תווים"),minlength:a.validator.format("נא למלא לפחות {0} תווים"),rangelength:a.validator.format("נא למלא ערך בין {0} ל- {1} תווים"),range:a.validator.format("נא למלא ערך בין {0} ל- {1}"),max:a.validator.format("נא למלא ערך קטן או שווה ל- {0}"),min:a.validator.format("נא למלא ערך גדול או שווה ל- {0}")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hr.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hr.js
deleted file mode 100644
index 792ac448..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hr.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: HR (Croatia; hrvatski jezik)
- */
-$.extend($.validator.messages, {
- required: "Ovo polje je obavezno.",
- remote: "Ovo polje treba popraviti.",
- email: "Unesite ispravnu e-mail adresu.",
- url: "Unesite ispravan URL.",
- date: "Unesite ispravan datum.",
- dateISO: "Unesite ispravan datum (ISO).",
- number: "Unesite ispravan broj.",
- digits: "Unesite samo brojeve.",
- creditcard: "Unesite ispravan broj kreditne kartice.",
- equalTo: "Unesite ponovo istu vrijednost.",
- extension: "Unesite vrijednost sa ispravnom ekstenzijom.",
- maxlength: $.validator.format("Maksimalni broj znakova je {0} ."),
- minlength: $.validator.format("Minimalni broj znakova je {0} ."),
- rangelength: $.validator.format("Unesite vrijednost između {0} i {1} znakova."),
- range: $.validator.format("Unesite vrijednost između {0} i {1}."),
- max: $.validator.format("Unesite vrijednost manju ili jednaku {0}."),
- min: $.validator.format("Unesite vrijednost veću ili jednaku {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hr.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hr.min.js
deleted file mode 100644
index 6161356f..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hr.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Ovo polje je obavezno.",remote:"Ovo polje treba popraviti.",email:"Unesite ispravnu e-mail adresu.",url:"Unesite ispravan URL.",date:"Unesite ispravan datum.",dateISO:"Unesite ispravan datum (ISO).",number:"Unesite ispravan broj.",digits:"Unesite samo brojeve.",creditcard:"Unesite ispravan broj kreditne kartice.",equalTo:"Unesite ponovo istu vrijednost.",extension:"Unesite vrijednost sa ispravnom ekstenzijom.",maxlength:a.validator.format("Maksimalni broj znakova je {0} ."),minlength:a.validator.format("Minimalni broj znakova je {0} ."),rangelength:a.validator.format("Unesite vrijednost između {0} i {1} znakova."),range:a.validator.format("Unesite vrijednost između {0} i {1}."),max:a.validator.format("Unesite vrijednost manju ili jednaku {0}."),min:a.validator.format("Unesite vrijednost veću ili jednaku {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hu.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hu.js
deleted file mode 100644
index 735bc3b6..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hu.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: HU (Hungarian; Magyar)
- */
-$.extend($.validator.messages, {
- required: "Kötelező megadni.",
- maxlength: $.validator.format("Legfeljebb {0} karakter hosszú legyen."),
- minlength: $.validator.format("Legalább {0} karakter hosszú legyen."),
- rangelength: $.validator.format("Legalább {0} és legfeljebb {1} karakter hosszú legyen."),
- email: "Érvényes e-mail címnek kell lennie.",
- url: "Érvényes URL-nek kell lennie.",
- date: "Dátumnak kell lennie.",
- number: "Számnak kell lennie.",
- digits: "Csak számjegyek lehetnek.",
- equalTo: "Meg kell egyeznie a két értéknek.",
- range: $.validator.format("{0} és {1} közé kell esnie."),
- max: $.validator.format("Nem lehet nagyobb, mint {0}."),
- min: $.validator.format("Nem lehet kisebb, mint {0}."),
- creditcard: "Érvényes hitelkártyaszámnak kell lennie.",
- remote: "Kérem javítsa ki ezt a mezőt.",
- dateISO: "Kérem írjon be egy érvényes dátumot (ISO)."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hu.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hu.min.js
deleted file mode 100644
index 0e224c9b..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hu.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Kötelező megadni.",maxlength:a.validator.format("Legfeljebb {0} karakter hosszú legyen."),minlength:a.validator.format("Legalább {0} karakter hosszú legyen."),rangelength:a.validator.format("Legalább {0} és legfeljebb {1} karakter hosszú legyen."),email:"Érvényes e-mail címnek kell lennie.",url:"Érvényes URL-nek kell lennie.",date:"Dátumnak kell lennie.",number:"Számnak kell lennie.",digits:"Csak számjegyek lehetnek.",equalTo:"Meg kell egyeznie a két értéknek.",range:a.validator.format("{0} és {1} közé kell esnie."),max:a.validator.format("Nem lehet nagyobb, mint {0}."),min:a.validator.format("Nem lehet kisebb, mint {0}."),creditcard:"Érvényes hitelkártyaszámnak kell lennie.",remote:"Kérem javítsa ki ezt a mezőt.",dateISO:"Kérem írjon be egy érvényes dátumot (ISO)."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hy_AM.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hy_AM.js
deleted file mode 100644
index d46a6261..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hy_AM.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: HY_AM (Armenian; հայերեն լեզու)
- */
-$.extend($.validator.messages, {
- required: "Պարտադիր լրացման դաշտ",
- remote: "Ներմուծեք ճիշտ արժեքը",
- email: "Ներմուծեք վավեր էլեկտրոնային փոստի հասցե",
- url: "Ներմուծեք վավեր URL",
- date: "Ներմուծեք վավեր ամսաթիվ",
- dateISO: "Ներմուծեք ISO ֆորմատով վավեր ամսաթիվ։",
- number: "Ներմուծեք թիվ",
- digits: "Ներմուծեք միայն թվեր",
- creditcard: "Ներմուծեք ճիշտ բանկային քարտի համար",
- equalTo: "Ներմուծեք միևնուն արժեքը ևս մեկ անգամ",
- extension: "Ընտրեք ճիշտ ընդլանումով ֆայլ",
- maxlength: $.validator.format("Ներմուծեք ոչ ավել քան {0} նիշ"),
- minlength: $.validator.format("Ներմուծեք ոչ պակաս քան {0} նիշ"),
- rangelength: $.validator.format("Ներմուծեք {0}֊ից {1} երկարությամբ արժեք"),
- range: $.validator.format("Ներմուծեք թիվ {0}֊ից {1} միջակայքում"),
- max: $.validator.format("Ներմուծեք թիվ, որը փոքր կամ հավասար է {0}֊ին"),
- min: $.validator.format("Ներմուծեք թիվ, որը մեծ կամ հավասար է {0}֊ին")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hy_AM.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hy_AM.min.js
deleted file mode 100644
index 5f83475c..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_hy_AM.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Պարտադիր լրացման դաշտ",remote:"Ներմուծեք ճիշտ արժեքը",email:"Ներմուծեք վավեր էլեկտրոնային փոստի հասցե",url:"Ներմուծեք վավեր URL",date:"Ներմուծեք վավեր ամսաթիվ",dateISO:"Ներմուծեք ISO ֆորմատով վավեր ամսաթիվ։",number:"Ներմուծեք թիվ",digits:"Ներմուծեք միայն թվեր",creditcard:"Ներմուծեք ճիշտ բանկային քարտի համար",equalTo:"Ներմուծեք միևնուն արժեքը ևս մեկ անգամ",extension:"Ընտրեք ճիշտ ընդլանումով ֆայլ",maxlength:a.validator.format("Ներմուծեք ոչ ավել քան {0} նիշ"),minlength:a.validator.format("Ներմուծեք ոչ պակաս քան {0} նիշ"),rangelength:a.validator.format("Ներմուծեք {0}֊ից {1} երկարությամբ արժեք"),range:a.validator.format("Ներմուծեք թիվ {0}֊ից {1} միջակայքում"),max:a.validator.format("Ներմուծեք թիվ, որը փոքր կամ հավասար է {0}֊ին"),min:a.validator.format("Ներմուծեք թիվ, որը մեծ կամ հավասար է {0}֊ին")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_id.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_id.js
deleted file mode 100644
index 48f7b9ad..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_id.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: ID (Indonesia; Indonesian)
- */
-$.extend($.validator.messages, {
- required: "Kolom ini diperlukan.",
- remote: "Harap benarkan kolom ini.",
- email: "Silakan masukkan format email yang benar.",
- url: "Silakan masukkan format URL yang benar.",
- date: "Silakan masukkan format tanggal yang benar.",
- dateISO: "Silakan masukkan format tanggal(ISO) yang benar.",
- number: "Silakan masukkan angka yang benar.",
- digits: "Harap masukan angka saja.",
- creditcard: "Harap masukkan format kartu kredit yang benar.",
- equalTo: "Harap masukkan nilai yg sama dengan sebelumnya.",
- maxlength: $.validator.format("Input dibatasi hanya {0} karakter."),
- minlength: $.validator.format("Input tidak kurang dari {0} karakter."),
- rangelength: $.validator.format("Panjang karakter yg diizinkan antara {0} dan {1} karakter."),
- range: $.validator.format("Harap masukkan nilai antara {0} dan {1}."),
- max: $.validator.format("Harap masukkan nilai lebih kecil atau sama dengan {0}."),
- min: $.validator.format("Harap masukkan nilai lebih besar atau sama dengan {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_id.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_id.min.js
deleted file mode 100644
index 7698afcc..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_id.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Kolom ini diperlukan.",remote:"Harap benarkan kolom ini.",email:"Silakan masukkan format email yang benar.",url:"Silakan masukkan format URL yang benar.",date:"Silakan masukkan format tanggal yang benar.",dateISO:"Silakan masukkan format tanggal(ISO) yang benar.",number:"Silakan masukkan angka yang benar.",digits:"Harap masukan angka saja.",creditcard:"Harap masukkan format kartu kredit yang benar.",equalTo:"Harap masukkan nilai yg sama dengan sebelumnya.",maxlength:a.validator.format("Input dibatasi hanya {0} karakter."),minlength:a.validator.format("Input tidak kurang dari {0} karakter."),rangelength:a.validator.format("Panjang karakter yg diizinkan antara {0} dan {1} karakter."),range:a.validator.format("Harap masukkan nilai antara {0} dan {1}."),max:a.validator.format("Harap masukkan nilai lebih kecil atau sama dengan {0}."),min:a.validator.format("Harap masukkan nilai lebih besar atau sama dengan {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_is.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_is.js
deleted file mode 100644
index 00948d4f..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_is.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: IS (Icelandic; íslenska)
- */
-$.extend($.validator.messages, {
- required: "Þessi reitur er nauðsynlegur.",
- remote: "Lagaðu þennan reit.",
- maxlength: $.validator.format("Sláðu inn mest {0} stafi."),
- minlength: $.validator.format("Sláðu inn minnst {0} stafi."),
- rangelength: $.validator.format("Sláðu inn minnst {0} og mest {1} stafi."),
- email: "Sláðu inn gilt netfang.",
- url: "Sláðu inn gilda vefslóð.",
- date: "Sláðu inn gilda dagsetningu.",
- number: "Sláðu inn tölu.",
- digits: "Sláðu inn tölustafi eingöngu.",
- equalTo: "Sláðu sama gildi inn aftur.",
- range: $.validator.format("Sláðu inn gildi milli {0} og {1}."),
- max: $.validator.format("Sláðu inn gildi sem er minna en eða jafnt og {0}."),
- min: $.validator.format("Sláðu inn gildi sem er stærra en eða jafnt og {0}."),
- creditcard: "Sláðu inn gilt greiðslukortanúmer."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_is.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_is.min.js
deleted file mode 100644
index d1a2a500..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_is.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Þessi reitur er nauðsynlegur.",remote:"Lagaðu þennan reit.",maxlength:a.validator.format("Sláðu inn mest {0} stafi."),minlength:a.validator.format("Sláðu inn minnst {0} stafi."),rangelength:a.validator.format("Sláðu inn minnst {0} og mest {1} stafi."),email:"Sláðu inn gilt netfang.",url:"Sláðu inn gilda vefslóð.",date:"Sláðu inn gilda dagsetningu.",number:"Sláðu inn tölu.",digits:"Sláðu inn tölustafi eingöngu.",equalTo:"Sláðu sama gildi inn aftur.",range:a.validator.format("Sláðu inn gildi milli {0} og {1}."),max:a.validator.format("Sláðu inn gildi sem er minna en eða jafnt og {0}."),min:a.validator.format("Sláðu inn gildi sem er stærra en eða jafnt og {0}."),creditcard:"Sláðu inn gilt greiðslukortanúmer."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_it.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_it.js
deleted file mode 100644
index 170152d3..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_it.js
+++ /dev/null
@@ -1,37 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: IT (Italian; Italiano)
- */
-$.extend($.validator.messages, {
- required: "Campo obbligatorio",
- remote: "Controlla questo campo",
- email: "Inserisci un indirizzo email valido",
- url: "Inserisci un indirizzo web valido",
- date: "Inserisci una data valida",
- dateISO: "Inserisci una data valida (ISO)",
- number: "Inserisci un numero valido",
- digits: "Inserisci solo numeri",
- creditcard: "Inserisci un numero di carta di credito valido",
- equalTo: "Il valore non corrisponde",
- extension: "Inserisci un valore con un&apos;estensione valida",
- maxlength: $.validator.format("Non inserire pi&ugrave; di {0} caratteri"),
- minlength: $.validator.format("Inserisci almeno {0} caratteri"),
- rangelength: $.validator.format("Inserisci un valore compreso tra {0} e {1} caratteri"),
- range: $.validator.format("Inserisci un valore compreso tra {0} e {1}"),
- max: $.validator.format("Inserisci un valore minore o uguale a {0}"),
- min: $.validator.format("Inserisci un valore maggiore o uguale a {0}"),
- nifES: "Inserisci un NIF valido",
- nieES: "Inserisci un NIE valido",
- cifES: "Inserisci un CIF valido",
- currency: "Inserisci una valuta valida"
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_it.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_it.min.js
deleted file mode 100644
index bb91758b..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_it.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Campo obbligatorio",remote:"Controlla questo campo",email:"Inserisci un indirizzo email valido",url:"Inserisci un indirizzo web valido",date:"Inserisci una data valida",dateISO:"Inserisci una data valida (ISO)",number:"Inserisci un numero valido",digits:"Inserisci solo numeri",creditcard:"Inserisci un numero di carta di credito valido",equalTo:"Il valore non corrisponde",extension:"Inserisci un valore con un&apos;estensione valida",maxlength:a.validator.format("Non inserire pi&ugrave; di {0} caratteri"),minlength:a.validator.format("Inserisci almeno {0} caratteri"),rangelength:a.validator.format("Inserisci un valore compreso tra {0} e {1} caratteri"),range:a.validator.format("Inserisci un valore compreso tra {0} e {1}"),max:a.validator.format("Inserisci un valore minore o uguale a {0}"),min:a.validator.format("Inserisci un valore maggiore o uguale a {0}"),nifES:"Inserisci un NIF valido",nieES:"Inserisci un NIE valido",cifES:"Inserisci un CIF valido",currency:"Inserisci una valuta valida"})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ja.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ja.js
deleted file mode 100644
index 3eed43d3..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ja.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: JA (Japanese; 日本語)
- */
-$.extend($.validator.messages, {
- required: "このフィールドは必須です。",
- remote: "このフィールドを修正してください。",
- email: "有効なEメールアドレスを入力してください。",
- url: "有効なURLを入力してください。",
- date: "有効な日付を入力してください。",
- dateISO: "有効な日付(ISO)を入力してください。",
- number: "有効な数字を入力してください。",
- digits: "数字のみを入力してください。",
- creditcard: "有効なクレジットカード番号を入力してください。",
- equalTo: "同じ値をもう一度入力してください。",
- extension: "有効な拡張子を含む値を入力してください。",
- maxlength: $.validator.format("{0} 文字以内で入力してください。"),
- minlength: $.validator.format("{0} 文字以上で入力してください。"),
- rangelength: $.validator.format("{0} 文字から {1} 文字までの値を入力してください。"),
- range: $.validator.format("{0} から {1} までの値を入力してください。"),
- max: $.validator.format("{0} 以下の値を入力してください。"),
- min: $.validator.format("{0} 以上の値を入力してください。")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ja.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ja.min.js
deleted file mode 100644
index 479550bd..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ja.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"このフィールドは必須です。",remote:"このフィールドを修正してください。",email:"有効なEメールアドレスを入力してください。",url:"有効なURLを入力してください。",date:"有効な日付を入力してください。",dateISO:"有効な日付(ISO)を入力してください。",number:"有効な数字を入力してください。",digits:"数字のみを入力してください。",creditcard:"有効なクレジットカード番号を入力してください。",equalTo:"同じ値をもう一度入力してください。",extension:"有効な拡張子を含む値を入力してください。",maxlength:a.validator.format("{0} 文字以内で入力してください。"),minlength:a.validator.format("{0} 文字以上で入力してください。"),rangelength:a.validator.format("{0} 文字から {1} 文字までの値を入力してください。"),range:a.validator.format("{0} から {1} までの値を入力してください。"),max:a.validator.format("{0} 以下の値を入力してください。"),min:a.validator.format("{0} 以上の値を入力してください。")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ka.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ka.js
deleted file mode 100644
index 494ec918..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ka.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: KA (Georgian; ქართული)
- */
-$.extend($.validator.messages, {
- required: "ამ ველის შევსება აუცილებელია.",
- remote: "გთხოვთ მიუთითოთ სწორი მნიშვნელობა.",
- email: "გთხოვთ მიუთითოთ ელ-ფოსტის კორექტული მისამართი.",
- url: "გთხოვთ მიუთითოთ კორექტული URL.",
- date: "გთხოვთ მიუთითოთ კორექტული თარიღი.",
- dateISO: "გთხოვთ მიუთითოთ კორექტული თარიღი ISO ფორმატში.",
- number: "გთხოვთ მიუთითოთ ციფრი.",
- digits: "გთხოვთ მიუთითოთ მხოლოდ ციფრები.",
- creditcard: "გთხოვთ მიუთითოთ საკრედიტო ბარათის კორექტული ნომერი.",
- equalTo: "გთხოვთ მიუთითოთ ასეთივე მნიშვნელობა კიდევ ერთხელ.",
- extension: "გთხოვთ აირჩიოთ ფაილი კორექტული გაფართოებით.",
- maxlength: $.validator.format("დასაშვებია არაუმეტეს {0} სიმბოლო."),
- minlength: $.validator.format("აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო."),
- rangelength: $.validator.format("ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე."),
- range: $.validator.format("გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე."),
- max: $.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს."),
- min: $.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ka.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ka.min.js
deleted file mode 100644
index 79c42d51..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ka.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"ამ ველის შევსება აუცილებელია.",remote:"გთხოვთ მიუთითოთ სწორი მნიშვნელობა.",email:"გთხოვთ მიუთითოთ ელ-ფოსტის კორექტული მისამართი.",url:"გთხოვთ მიუთითოთ კორექტული URL.",date:"გთხოვთ მიუთითოთ კორექტული თარიღი.",dateISO:"გთხოვთ მიუთითოთ კორექტული თარიღი ISO ფორმატში.",number:"გთხოვთ მიუთითოთ ციფრი.",digits:"გთხოვთ მიუთითოთ მხოლოდ ციფრები.",creditcard:"გთხოვთ მიუთითოთ საკრედიტო ბარათის კორექტული ნომერი.",equalTo:"გთხოვთ მიუთითოთ ასეთივე მნიშვნელობა კიდევ ერთხელ.",extension:"გთხოვთ აირჩიოთ ფაილი კორექტული გაფართოებით.",maxlength:a.validator.format("დასაშვებია არაუმეტეს {0} სიმბოლო."),minlength:a.validator.format("აუცილებელია შეიყვანოთ მინიმუმ {0} სიმბოლო."),rangelength:a.validator.format("ტექსტში სიმბოლოების რაოდენობა უნდა იყოს {0}-დან {1}-მდე."),range:a.validator.format("გთხოვთ შეიყვანოთ ციფრი {0}-დან {1}-მდე."),max:a.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც ნაკლებია ან უდრის {0}-ს."),min:a.validator.format("გთხოვთ შეიყვანოთ ციფრი რომელიც მეტია ან უდრის {0}-ს.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_kk.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_kk.js
deleted file mode 100644
index 17c8b83a..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_kk.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: KK (Kazakh; қазақ тілі)
- */
-$.extend($.validator.messages, {
- required: "Бұл өрісті міндетті түрде толтырыңыз.",
- remote: "Дұрыс мағына енгізуіңізді сұраймыз.",
- email: "Нақты электронды поштаңызды енгізуіңізді сұраймыз.",
- url: "Нақты URL-ды енгізуіңізді сұраймыз.",
- date: "Нақты URL-ды енгізуіңізді сұраймыз.",
- dateISO: "Нақты ISO форматымен сәйкес датасын енгізуіңізді сұраймыз.",
- number: "Күнді енгізуіңізді сұраймыз.",
- digits: "Тек қана сандарды енгізуіңізді сұраймыз.",
- creditcard: "Несие картасының нөмірін дұрыс енгізуіңізді сұраймыз.",
- equalTo: "Осы мәнді қайта енгізуіңізді сұраймыз.",
- extension: "Файлдың кеңейтуін дұрыс таңдаңыз.",
- maxlength: $.validator.format("Ұзындығы {0} символдан көр болмасын."),
- minlength: $.validator.format("Ұзындығы {0} символдан аз болмасын."),
- rangelength: $.validator.format("Ұзындығы {0}-{1} дейін мән енгізуіңізді сұраймыз."),
- range: $.validator.format("Пожалуйста, введите число от {0} до {1}. - {0} - {1} санын енгізуіңізді сұраймыз."),
- max: $.validator.format("{0} аз немесе тең санын енгізуіңіді сұраймыз."),
- min: $.validator.format("{0} көп немесе тең санын енгізуіңізді сұраймыз.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_kk.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_kk.min.js
deleted file mode 100644
index 927cfa73..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_kk.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Бұл өрісті міндетті түрде толтырыңыз.",remote:"Дұрыс мағына енгізуіңізді сұраймыз.",email:"Нақты электронды поштаңызды енгізуіңізді сұраймыз.",url:"Нақты URL-ды енгізуіңізді сұраймыз.",date:"Нақты URL-ды енгізуіңізді сұраймыз.",dateISO:"Нақты ISO форматымен сәйкес датасын енгізуіңізді сұраймыз.",number:"Күнді енгізуіңізді сұраймыз.",digits:"Тек қана сандарды енгізуіңізді сұраймыз.",creditcard:"Несие картасының нөмірін дұрыс енгізуіңізді сұраймыз.",equalTo:"Осы мәнді қайта енгізуіңізді сұраймыз.",extension:"Файлдың кеңейтуін дұрыс таңдаңыз.",maxlength:a.validator.format("Ұзындығы {0} символдан көр болмасын."),minlength:a.validator.format("Ұзындығы {0} символдан аз болмасын."),rangelength:a.validator.format("Ұзындығы {0}-{1} дейін мән енгізуіңізді сұраймыз."),range:a.validator.format("Пожалуйста, введите число от {0} до {1}. - {0} - {1} санын енгізуіңізді сұраймыз."),max:a.validator.format("{0} аз немесе тең санын енгізуіңіді сұраймыз."),min:a.validator.format("{0} көп немесе тең санын енгізуіңізді сұраймыз.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ko.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ko.js
deleted file mode 100644
index f6b53559..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ko.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: KO (Korean; 한국어)
- */
-$.extend($.validator.messages, {
- required: "필수 항목입니다.",
- remote: "항목을 수정하세요.",
- email: "유효하지 않은 E-Mail주소입니다.",
- url: "유효하지 않은 URL입니다.",
- date: "올바른 날짜를 입력하세요.",
- dateISO: "올바른 날짜(ISO)를 입력하세요.",
- number: "유효한 숫자가 아닙니다.",
- digits: "숫자만 입력 가능합니다.",
- creditcard: "신용카드 번호가 바르지 않습니다.",
- equalTo: "같은 값을 다시 입력하세요.",
- extension: "올바른 확장자가 아닙니다.",
- maxlength: $.validator.format("{0}자를 넘을 수 없습니다. "),
- minlength: $.validator.format("{0}자 이상 입력하세요."),
- rangelength: $.validator.format("문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요."),
- range: $.validator.format("{0} 에서 {1} 사이의 값을 입력하세요."),
- max: $.validator.format("{0} 이하의 값을 입력하세요."),
- min: $.validator.format("{0} 이상의 값을 입력하세요.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ko.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ko.min.js
deleted file mode 100644
index 24c7cb7b..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ko.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"필수 항목입니다.",remote:"항목을 수정하세요.",email:"유효하지 않은 E-Mail주소입니다.",url:"유효하지 않은 URL입니다.",date:"올바른 날짜를 입력하세요.",dateISO:"올바른 날짜(ISO)를 입력하세요.",number:"유효한 숫자가 아닙니다.",digits:"숫자만 입력 가능합니다.",creditcard:"신용카드 번호가 바르지 않습니다.",equalTo:"같은 값을 다시 입력하세요.",extension:"올바른 확장자가 아닙니다.",maxlength:a.validator.format("{0}자를 넘을 수 없습니다. "),minlength:a.validator.format("{0}자 이상 입력하세요."),rangelength:a.validator.format("문자 길이가 {0} 에서 {1} 사이의 값을 입력하세요."),range:a.validator.format("{0} 에서 {1} 사이의 값을 입력하세요."),max:a.validator.format("{0} 이하의 값을 입력하세요."),min:a.validator.format("{0} 이상의 값을 입력하세요.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lt.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lt.js
deleted file mode 100644
index df17a1ed..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lt.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: LT (Lithuanian; lietuvių kalba)
- */
-$.extend($.validator.messages, {
- required: "Šis laukas yra privalomas.",
- remote: "Prašau pataisyti šį lauką.",
- email: "Prašau įvesti teisingą elektroninio pašto adresą.",
- url: "Prašau įvesti teisingą URL.",
- date: "Prašau įvesti teisingą datą.",
- dateISO: "Prašau įvesti teisingą datą (ISO).",
- number: "Prašau įvesti teisingą skaičių.",
- digits: "Prašau naudoti tik skaitmenis.",
- creditcard: "Prašau įvesti teisingą kreditinės kortelės numerį.",
- equalTo: "Prašau įvestį tą pačią reikšmę dar kartą.",
- extension: "Prašau įvesti reikšmę su teisingu plėtiniu.",
- maxlength: $.validator.format("Prašau įvesti ne daugiau kaip {0} simbolių."),
- minlength: $.validator.format("Prašau įvesti bent {0} simbolius."),
- rangelength: $.validator.format("Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių."),
- range: $.validator.format("Prašau įvesti reikšmę intervale nuo {0} iki {1}."),
- max: $.validator.format("Prašau įvesti reikšmę mažesnę arba lygią {0}."),
- min: $.validator.format("Prašau įvesti reikšmę didesnę arba lygią {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lt.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lt.min.js
deleted file mode 100644
index d0dfebbf..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lt.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Šis laukas yra privalomas.",remote:"Prašau pataisyti šį lauką.",email:"Prašau įvesti teisingą elektroninio pašto adresą.",url:"Prašau įvesti teisingą URL.",date:"Prašau įvesti teisingą datą.",dateISO:"Prašau įvesti teisingą datą (ISO).",number:"Prašau įvesti teisingą skaičių.",digits:"Prašau naudoti tik skaitmenis.",creditcard:"Prašau įvesti teisingą kreditinės kortelės numerį.",equalTo:"Prašau įvestį tą pačią reikšmę dar kartą.",extension:"Prašau įvesti reikšmę su teisingu plėtiniu.",maxlength:a.validator.format("Prašau įvesti ne daugiau kaip {0} simbolių."),minlength:a.validator.format("Prašau įvesti bent {0} simbolius."),rangelength:a.validator.format("Prašau įvesti reikšmes, kurių ilgis nuo {0} iki {1} simbolių."),range:a.validator.format("Prašau įvesti reikšmę intervale nuo {0} iki {1}."),max:a.validator.format("Prašau įvesti reikšmę mažesnę arba lygią {0}."),min:a.validator.format("Prašau įvesti reikšmę didesnę arba lygią {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lv.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lv.js
deleted file mode 100644
index ade1b88f..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lv.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: LV (Latvian; latviešu valoda)
- */
-$.extend($.validator.messages, {
- required: "Šis lauks ir obligāts.",
- remote: "Lūdzu, pārbaudiet šo lauku.",
- email: "Lūdzu, ievadiet derīgu e-pasta adresi.",
- url: "Lūdzu, ievadiet derīgu URL adresi.",
- date: "Lūdzu, ievadiet derīgu datumu.",
- dateISO: "Lūdzu, ievadiet derīgu datumu (ISO).",
- number: "Lūdzu, ievadiet derīgu numuru.",
- digits: "Lūdzu, ievadiet tikai ciparus.",
- creditcard: "Lūdzu, ievadiet derīgu kredītkartes numuru.",
- equalTo: "Lūdzu, ievadiet to pašu vēlreiz.",
- extension: "Lūdzu, ievadiet vērtību ar derīgu paplašinājumu.",
- maxlength: $.validator.format("Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes."),
- minlength: $.validator.format("Lūdzu, ievadiet vismaz {0} rakstzīmes."),
- rangelength: $.validator.format("Lūdzu ievadiet {0} līdz {1} rakstzīmes."),
- range: $.validator.format("Lūdzu, ievadiet skaitli no {0} līdz {1}."),
- max: $.validator.format("Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}."),
- min: $.validator.format("Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lv.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lv.min.js
deleted file mode 100644
index 789831ea..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_lv.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Šis lauks ir obligāts.",remote:"Lūdzu, pārbaudiet šo lauku.",email:"Lūdzu, ievadiet derīgu e-pasta adresi.",url:"Lūdzu, ievadiet derīgu URL adresi.",date:"Lūdzu, ievadiet derīgu datumu.",dateISO:"Lūdzu, ievadiet derīgu datumu (ISO).",number:"Lūdzu, ievadiet derīgu numuru.",digits:"Lūdzu, ievadiet tikai ciparus.",creditcard:"Lūdzu, ievadiet derīgu kredītkartes numuru.",equalTo:"Lūdzu, ievadiet to pašu vēlreiz.",extension:"Lūdzu, ievadiet vērtību ar derīgu paplašinājumu.",maxlength:a.validator.format("Lūdzu, ievadiet ne vairāk kā {0} rakstzīmes."),minlength:a.validator.format("Lūdzu, ievadiet vismaz {0} rakstzīmes."),rangelength:a.validator.format("Lūdzu ievadiet {0} līdz {1} rakstzīmes."),range:a.validator.format("Lūdzu, ievadiet skaitli no {0} līdz {1}."),max:a.validator.format("Lūdzu, ievadiet skaitli, kurš ir mazāks vai vienāds ar {0}."),min:a.validator.format("Lūdzu, ievadiet skaitli, kurš ir lielāks vai vienāds ar {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_my.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_my.js
deleted file mode 100644
index 9de974ab..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_my.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: MY (Malay; Melayu)
- */
-$.extend($.validator.messages, {
- required: "Medan ini diperlukan.",
- remote: "Sila betulkan medan ini.",
- email: "Sila masukkan alamat emel yang betul.",
- url: "Sila masukkan URL yang betul.",
- date: "Sila masukkan tarikh yang betul.",
- dateISO: "Sila masukkan tarikh(ISO) yang betul.",
- number: "Sila masukkan nombor yang betul.",
- digits: "Sila masukkan nilai digit sahaja.",
- creditcard: "Sila masukkan nombor kredit kad yang betul.",
- equalTo: "Sila masukkan nilai yang sama semula.",
- extension: "Sila masukkan nilai yang telah diterima.",
- maxlength: $.validator.format("Sila masukkan nilai tidak lebih dari {0} aksara."),
- minlength: $.validator.format("Sila masukkan nilai sekurang-kurangnya {0} aksara."),
- rangelength: $.validator.format("Sila masukkan panjang nilai antara {0} dan {1} aksara."),
- range: $.validator.format("Sila masukkan nilai antara {0} dan {1} aksara."),
- max: $.validator.format("Sila masukkan nilai yang kurang atau sama dengan {0}."),
- min: $.validator.format("Sila masukkan nilai yang lebih atau sama dengan {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_my.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_my.min.js
deleted file mode 100644
index 6cb9bfc6..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_my.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Medan ini diperlukan.",remote:"Sila betulkan medan ini.",email:"Sila masukkan alamat emel yang betul.",url:"Sila masukkan URL yang betul.",date:"Sila masukkan tarikh yang betul.",dateISO:"Sila masukkan tarikh(ISO) yang betul.",number:"Sila masukkan nombor yang betul.",digits:"Sila masukkan nilai digit sahaja.",creditcard:"Sila masukkan nombor kredit kad yang betul.",equalTo:"Sila masukkan nilai yang sama semula.",extension:"Sila masukkan nilai yang telah diterima.",maxlength:a.validator.format("Sila masukkan nilai tidak lebih dari {0} aksara."),minlength:a.validator.format("Sila masukkan nilai sekurang-kurangnya {0} aksara."),rangelength:a.validator.format("Sila masukkan panjang nilai antara {0} dan {1} aksara."),range:a.validator.format("Sila masukkan nilai antara {0} dan {1} aksara."),max:a.validator.format("Sila masukkan nilai yang kurang atau sama dengan {0}."),min:a.validator.format("Sila masukkan nilai yang lebih atau sama dengan {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_nl.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_nl.js
deleted file mode 100644
index cdba3812..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_nl.js
+++ /dev/null
@@ -1,43 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: NL (Dutch; Nederlands, Vlaams)
- */
-$.extend($.validator.messages, {
- required: "Dit is een verplicht veld.",
- remote: "Controleer dit veld.",
- email: "Vul hier een geldig e-mailadres in.",
- url: "Vul hier een geldige URL in.",
- date: "Vul hier een geldige datum in.",
- dateISO: "Vul hier een geldige datum in (ISO-formaat).",
- number: "Vul hier een geldig getal in.",
- digits: "Vul hier alleen getallen in.",
- creditcard: "Vul hier een geldig creditcardnummer in.",
- equalTo: "Vul hier dezelfde waarde in.",
- extension: "Vul hier een waarde in met een geldige extensie.",
- maxlength: $.validator.format("Vul hier maximaal {0} tekens in."),
- minlength: $.validator.format("Vul hier minimaal {0} tekens in."),
- rangelength: $.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1} tekens."),
- range: $.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1}."),
- max: $.validator.format("Vul hier een waarde in kleiner dan of gelijk aan {0}."),
- min: $.validator.format("Vul hier een waarde in groter dan of gelijk aan {0}."),
-
- // for validations in additional-methods.js
- iban: "Vul hier een geldig IBAN in.",
- dateNL: "Vul hier een geldige datum in.",
- phoneNL: "Vul hier een geldig Nederlands telefoonnummer in.",
- mobileNL: "Vul hier een geldig Nederlands mobiel telefoonnummer in.",
- postalcodeNL: "Vul hier een geldige postcode in.",
- bankaccountNL: "Vul hier een geldig bankrekeningnummer in.",
- giroaccountNL: "Vul hier een geldig gironummer in.",
- bankorgiroaccountNL: "Vul hier een geldig bank- of gironummer in."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_nl.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_nl.min.js
deleted file mode 100644
index b28c8a8b..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_nl.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Dit is een verplicht veld.",remote:"Controleer dit veld.",email:"Vul hier een geldig e-mailadres in.",url:"Vul hier een geldige URL in.",date:"Vul hier een geldige datum in.",dateISO:"Vul hier een geldige datum in (ISO-formaat).",number:"Vul hier een geldig getal in.",digits:"Vul hier alleen getallen in.",creditcard:"Vul hier een geldig creditcardnummer in.",equalTo:"Vul hier dezelfde waarde in.",extension:"Vul hier een waarde in met een geldige extensie.",maxlength:a.validator.format("Vul hier maximaal {0} tekens in."),minlength:a.validator.format("Vul hier minimaal {0} tekens in."),rangelength:a.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1} tekens."),range:a.validator.format("Vul hier een waarde in van minimaal {0} en maximaal {1}."),max:a.validator.format("Vul hier een waarde in kleiner dan of gelijk aan {0}."),min:a.validator.format("Vul hier een waarde in groter dan of gelijk aan {0}."),iban:"Vul hier een geldig IBAN in.",dateNL:"Vul hier een geldige datum in.",phoneNL:"Vul hier een geldig Nederlands telefoonnummer in.",mobileNL:"Vul hier een geldig Nederlands mobiel telefoonnummer in.",postalcodeNL:"Vul hier een geldige postcode in.",bankaccountNL:"Vul hier een geldig bankrekeningnummer in.",giroaccountNL:"Vul hier een geldig gironummer in.",bankorgiroaccountNL:"Vul hier een geldig bank- of gironummer in."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_no.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_no.js
deleted file mode 100644
index 308b715a..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_no.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: NO (Norwegian; Norsk)
- */
-$.extend($.validator.messages, {
- required: "Dette feltet er obligatorisk.",
- maxlength: $.validator.format("Maksimalt {0} tegn."),
- minlength: $.validator.format("Minimum {0} tegn."),
- rangelength: $.validator.format("Angi minimum {0} og maksimum {1} tegn."),
- email: "Oppgi en gyldig epostadresse.",
- url: "Angi en gyldig URL.",
- date: "Angi en gyldig dato.",
- dateISO: "Angi en gyldig dato (&ARING;&ARING;&ARING;&ARING;-MM-DD).",
- dateSE: "Angi en gyldig dato.",
- number: "Angi et gyldig nummer.",
- numberSE: "Angi et gyldig nummer.",
- digits: "Skriv kun tall.",
- equalTo: "Skriv samme verdi igjen.",
- range: $.validator.format("Angi en verdi mellom {0} og {1}."),
- max: $.validator.format("Angi en verdi som er mindre eller lik {0}."),
- min: $.validator.format("Angi en verdi som er st&oslash;rre eller lik {0}."),
- creditcard: "Angi et gyldig kredittkortnummer."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_no.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_no.min.js
deleted file mode 100644
index c860d217..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_no.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Dette feltet er obligatorisk.",maxlength:a.validator.format("Maksimalt {0} tegn."),minlength:a.validator.format("Minimum {0} tegn."),rangelength:a.validator.format("Angi minimum {0} og maksimum {1} tegn."),email:"Oppgi en gyldig epostadresse.",url:"Angi en gyldig URL.",date:"Angi en gyldig dato.",dateISO:"Angi en gyldig dato (&ARING;&ARING;&ARING;&ARING;-MM-DD).",dateSE:"Angi en gyldig dato.",number:"Angi et gyldig nummer.",numberSE:"Angi et gyldig nummer.",digits:"Skriv kun tall.",equalTo:"Skriv samme verdi igjen.",range:a.validator.format("Angi en verdi mellom {0} og {1}."),max:a.validator.format("Angi en verdi som er mindre eller lik {0}."),min:a.validator.format("Angi en verdi som er st&oslash;rre eller lik {0}."),creditcard:"Angi et gyldig kredittkortnummer."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pl.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pl.js
deleted file mode 100644
index 453ba772..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pl.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: PL (Polish; język polski, polszczyzna)
- */
-$.extend($.validator.messages, {
- required: "To pole jest wymagane.",
- remote: "Proszę o wypełnienie tego pola.",
- email: "Proszę o podanie prawidłowego adresu email.",
- url: "Proszę o podanie prawidłowego URL.",
- date: "Proszę o podanie prawidłowej daty.",
- dateISO: "Proszę o podanie prawidłowej daty (ISO).",
- number: "Proszę o podanie prawidłowej liczby.",
- digits: "Proszę o podanie samych cyfr.",
- creditcard: "Proszę o podanie prawidłowej karty kredytowej.",
- equalTo: "Proszę o podanie tej samej wartości ponownie.",
- extension: "Proszę o podanie wartości z prawidłowym rozszerzeniem.",
- maxlength: $.validator.format("Proszę o podanie nie więcej niż {0} znaków."),
- minlength: $.validator.format("Proszę o podanie przynajmniej {0} znaków."),
- rangelength: $.validator.format("Proszę o podanie wartości o długości od {0} do {1} znaków."),
- range: $.validator.format("Proszę o podanie wartości z przedziału od {0} do {1}."),
- max: $.validator.format("Proszę o podanie wartości mniejszej bądź równej {0}."),
- min: $.validator.format("Proszę o podanie wartości większej bądź równej {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pl.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pl.min.js
deleted file mode 100644
index 2684218b..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pl.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"To pole jest wymagane.",remote:"Proszę o wypełnienie tego pola.",email:"Proszę o podanie prawidłowego adresu email.",url:"Proszę o podanie prawidłowego URL.",date:"Proszę o podanie prawidłowej daty.",dateISO:"Proszę o podanie prawidłowej daty (ISO).",number:"Proszę o podanie prawidłowej liczby.",digits:"Proszę o podanie samych cyfr.",creditcard:"Proszę o podanie prawidłowej karty kredytowej.",equalTo:"Proszę o podanie tej samej wartości ponownie.",extension:"Proszę o podanie wartości z prawidłowym rozszerzeniem.",maxlength:a.validator.format("Proszę o podanie nie więcej niż {0} znaków."),minlength:a.validator.format("Proszę o podanie przynajmniej {0} znaków."),rangelength:a.validator.format("Proszę o podanie wartości o długości od {0} do {1} znaków."),range:a.validator.format("Proszę o podanie wartości z przedziału od {0} do {1}."),max:a.validator.format("Proszę o podanie wartości mniejszej bądź równej {0}."),min:a.validator.format("Proszę o podanie wartości większej bądź równej {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_BR.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_BR.js
deleted file mode 100644
index 63bc9564..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_BR.js
+++ /dev/null
@@ -1,39 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: PT (Portuguese; português)
- * Region: BR (Brazil)
- */
-$.extend($.validator.messages, {
- required: "Este campo &eacute; requerido.",
- remote: "Por favor, corrija este campo.",
- email: "Por favor, forne&ccedil;a um endere&ccedil;o de email v&aacute;lido.",
- url: "Por favor, forne&ccedil;a uma URL v&aacute;lida.",
- date: "Por favor, forne&ccedil;a uma data v&aacute;lida.",
- dateISO: "Por favor, forne&ccedil;a uma data v&aacute;lida (ISO).",
- number: "Por favor, forne&ccedil;a um n&uacute;mero v&aacute;lido.",
- digits: "Por favor, forne&ccedil;a somente d&iacute;gitos.",
- creditcard: "Por favor, forne&ccedil;a um cart&atilde;o de cr&eacute;dito v&aacute;lido.",
- equalTo: "Por favor, forne&ccedil;a o mesmo valor novamente.",
- extension: "Por favor, forne&ccedil;a um valor com uma extens&atilde;o v&aacute;lida.",
- maxlength: $.validator.format("Por favor, forne&ccedil;a n&atilde;o mais que {0} caracteres."),
- minlength: $.validator.format("Por favor, forne&ccedil;a ao menos {0} caracteres."),
- rangelength: $.validator.format("Por favor, forne&ccedil;a um valor entre {0} e {1} caracteres de comprimento."),
- range: $.validator.format("Por favor, forne&ccedil;a um valor entre {0} e {1}."),
- max: $.validator.format("Por favor, forne&ccedil;a um valor menor ou igual a {0}."),
- min: $.validator.format("Por favor, forne&ccedil;a um valor maior ou igual a {0}."),
- nifES: "Por favor, forne&ccedil;a um NIF v&aacute;lido.",
- nieES: "Por favor, forne&ccedil;a um NIE v&aacute;lido.",
- cifEE: "Por favor, forne&ccedil;a um CIF v&aacute;lido.",
- postalcodeBR: "Por favor, forne&ccedil;a um CEP v&aacute;lido.",
- cpfBR: "Por favor, forne&ccedil;a um CPF v&aacute;lido."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_BR.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_BR.min.js
deleted file mode 100644
index a121d244..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_BR.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Este campo &eacute; requerido.",remote:"Por favor, corrija este campo.",email:"Por favor, forne&ccedil;a um endere&ccedil;o de email v&aacute;lido.",url:"Por favor, forne&ccedil;a uma URL v&aacute;lida.",date:"Por favor, forne&ccedil;a uma data v&aacute;lida.",dateISO:"Por favor, forne&ccedil;a uma data v&aacute;lida (ISO).",number:"Por favor, forne&ccedil;a um n&uacute;mero v&aacute;lido.",digits:"Por favor, forne&ccedil;a somente d&iacute;gitos.",creditcard:"Por favor, forne&ccedil;a um cart&atilde;o de cr&eacute;dito v&aacute;lido.",equalTo:"Por favor, forne&ccedil;a o mesmo valor novamente.",extension:"Por favor, forne&ccedil;a um valor com uma extens&atilde;o v&aacute;lida.",maxlength:a.validator.format("Por favor, forne&ccedil;a n&atilde;o mais que {0} caracteres."),minlength:a.validator.format("Por favor, forne&ccedil;a ao menos {0} caracteres."),rangelength:a.validator.format("Por favor, forne&ccedil;a um valor entre {0} e {1} caracteres de comprimento."),range:a.validator.format("Por favor, forne&ccedil;a um valor entre {0} e {1}."),max:a.validator.format("Por favor, forne&ccedil;a um valor menor ou igual a {0}."),min:a.validator.format("Por favor, forne&ccedil;a um valor maior ou igual a {0}."),nifES:"Por favor, forne&ccedil;a um NIF v&aacute;lido.",nieES:"Por favor, forne&ccedil;a um NIE v&aacute;lido.",cifEE:"Por favor, forne&ccedil;a um CIF v&aacute;lido.",postalcodeBR:"Por favor, forne&ccedil;a um CEP v&aacute;lido.",cpfBR:"Por favor, forne&ccedil;a um CPF v&aacute;lido."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_PT.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_PT.js
deleted file mode 100644
index 4c2a7826..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_PT.js
+++ /dev/null
@@ -1,37 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: PT (Portuguese; português)
- * Region: PT (Portugal)
- */
-$.extend($.validator.messages, {
- required: "Campo de preenchimento obrigat&oacute;rio.",
- remote: "Por favor, corrija este campo.",
- email: "Por favor, introduza um endere&ccedil;o eletr&oacute;nico v&aacute;lido.",
- url: "Por favor, introduza um URL v&aacute;lido.",
- date: "Por favor, introduza uma data v&aacute;lida.",
- dateISO: "Por favor, introduza uma data v&aacute;lida (ISO).",
- number: "Por favor, introduza um n&uacute;mero v&aacute;lido.",
- digits: "Por favor, introduza apenas d&iacute;gitos.",
- creditcard: "Por favor, introduza um n&uacute;mero de cart&atilde;o de cr&eacute;dito v&aacute;lido.",
- equalTo: "Por favor, introduza de novo o mesmo valor.",
- extension: "Por favor, introduza um ficheiro com uma extens&atilde;o v&aacute;lida.",
- maxlength: $.validator.format("Por favor, n&atilde;o introduza mais do que {0} caracteres."),
- minlength: $.validator.format("Por favor, introduza pelo menos {0} caracteres."),
- rangelength: $.validator.format("Por favor, introduza entre {0} e {1} caracteres."),
- range: $.validator.format("Por favor, introduza um valor entre {0} e {1}."),
- max: $.validator.format("Por favor, introduza um valor menor ou igual a {0}."),
- min: $.validator.format("Por favor, introduza um valor maior ou igual a {0}."),
- nifES: "Por favor, introduza um NIF v&aacute;lido.",
- nieES: "Por favor, introduza um NIE v&aacute;lido.",
- cifES: "Por favor, introduza um CIF v&aacute;lido."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_PT.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_PT.min.js
deleted file mode 100644
index e4377fca..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_pt_PT.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Campo de preenchimento obrigat&oacute;rio.",remote:"Por favor, corrija este campo.",email:"Por favor, introduza um endere&ccedil;o eletr&oacute;nico v&aacute;lido.",url:"Por favor, introduza um URL v&aacute;lido.",date:"Por favor, introduza uma data v&aacute;lida.",dateISO:"Por favor, introduza uma data v&aacute;lida (ISO).",number:"Por favor, introduza um n&uacute;mero v&aacute;lido.",digits:"Por favor, introduza apenas d&iacute;gitos.",creditcard:"Por favor, introduza um n&uacute;mero de cart&atilde;o de cr&eacute;dito v&aacute;lido.",equalTo:"Por favor, introduza de novo o mesmo valor.",extension:"Por favor, introduza um ficheiro com uma extens&atilde;o v&aacute;lida.",maxlength:a.validator.format("Por favor, n&atilde;o introduza mais do que {0} caracteres."),minlength:a.validator.format("Por favor, introduza pelo menos {0} caracteres."),rangelength:a.validator.format("Por favor, introduza entre {0} e {1} caracteres."),range:a.validator.format("Por favor, introduza um valor entre {0} e {1}."),max:a.validator.format("Por favor, introduza um valor menor ou igual a {0}."),min:a.validator.format("Por favor, introduza um valor maior ou igual a {0}."),nifES:"Por favor, introduza um NIF v&aacute;lido.",nieES:"Por favor, introduza um NIE v&aacute;lido.",cifES:"Por favor, introduza um CIF v&aacute;lido."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ro.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ro.js
deleted file mode 100644
index be77eabc..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ro.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: RO (Romanian, limba română)
- */
-$.extend($.validator.messages, {
- required: "Acest câmp este obligatoriu.",
- remote: "Te rugăm să completezi acest câmp.",
- email: "Te rugăm să introduci o adresă de email validă",
- url: "Te rugăm sa introduci o adresă URL validă.",
- date: "Te rugăm să introduci o dată corectă.",
- dateISO: "Te rugăm să introduci o dată (ISO) corectă.",
- number: "Te rugăm să introduci un număr întreg valid.",
- digits: "Te rugăm să introduci doar cifre.",
- creditcard: "Te rugăm să introduci un numar de carte de credit valid.",
- equalTo: "Te rugăm să reintroduci valoarea.",
- extension: "Te rugăm să introduci o valoare cu o extensie validă.",
- maxlength: $.validator.format("Te rugăm să nu introduci mai mult de {0} caractere."),
- minlength: $.validator.format("Te rugăm să introduci cel puțin {0} caractere."),
- rangelength: $.validator.format("Te rugăm să introduci o valoare între {0} și {1} caractere."),
- range: $.validator.format("Te rugăm să introduci o valoare între {0} și {1}."),
- max: $.validator.format("Te rugăm să introduci o valoare egal sau mai mică decât {0}."),
- min: $.validator.format("Te rugăm să introduci o valoare egal sau mai mare decât {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ro.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ro.min.js
deleted file mode 100644
index fa36199f..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ro.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Acest câmp este obligatoriu.",remote:"Te rugăm să completezi acest câmp.",email:"Te rugăm să introduci o adresă de email validă",url:"Te rugăm sa introduci o adresă URL validă.",date:"Te rugăm să introduci o dată corectă.",dateISO:"Te rugăm să introduci o dată (ISO) corectă.",number:"Te rugăm să introduci un număr întreg valid.",digits:"Te rugăm să introduci doar cifre.",creditcard:"Te rugăm să introduci un numar de carte de credit valid.",equalTo:"Te rugăm să reintroduci valoarea.",extension:"Te rugăm să introduci o valoare cu o extensie validă.",maxlength:a.validator.format("Te rugăm să nu introduci mai mult de {0} caractere."),minlength:a.validator.format("Te rugăm să introduci cel puțin {0} caractere."),rangelength:a.validator.format("Te rugăm să introduci o valoare între {0} și {1} caractere."),range:a.validator.format("Te rugăm să introduci o valoare între {0} și {1}."),max:a.validator.format("Te rugăm să introduci o valoare egal sau mai mică decât {0}."),min:a.validator.format("Te rugăm să introduci o valoare egal sau mai mare decât {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ru.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ru.js
deleted file mode 100644
index 896827bf..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ru.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: RU (Russian; русский язык)
- */
-$.extend($.validator.messages, {
- required: "Это поле необходимо заполнить.",
- remote: "Пожалуйста, введите правильное значение.",
- email: "Пожалуйста, введите корректный адрес электронной почты.",
- url: "Пожалуйста, введите корректный URL.",
- date: "Пожалуйста, введите корректную дату.",
- dateISO: "Пожалуйста, введите корректную дату в формате ISO.",
- number: "Пожалуйста, введите число.",
- digits: "Пожалуйста, вводите только цифры.",
- creditcard: "Пожалуйста, введите правильный номер кредитной карты.",
- equalTo: "Пожалуйста, введите такое же значение ещё раз.",
- extension: "Пожалуйста, выберите файл с правильным расширением.",
- maxlength: $.validator.format("Пожалуйста, введите не больше {0} символов."),
- minlength: $.validator.format("Пожалуйста, введите не меньше {0} символов."),
- rangelength: $.validator.format("Пожалуйста, введите значение длиной от {0} до {1} символов."),
- range: $.validator.format("Пожалуйста, введите число от {0} до {1}."),
- max: $.validator.format("Пожалуйста, введите число, меньшее или равное {0}."),
- min: $.validator.format("Пожалуйста, введите число, большее или равное {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ru.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ru.min.js
deleted file mode 100644
index b5c84081..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_ru.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Это поле необходимо заполнить.",remote:"Пожалуйста, введите правильное значение.",email:"Пожалуйста, введите корректный адрес электронной почты.",url:"Пожалуйста, введите корректный URL.",date:"Пожалуйста, введите корректную дату.",dateISO:"Пожалуйста, введите корректную дату в формате ISO.",number:"Пожалуйста, введите число.",digits:"Пожалуйста, вводите только цифры.",creditcard:"Пожалуйста, введите правильный номер кредитной карты.",equalTo:"Пожалуйста, введите такое же значение ещё раз.",extension:"Пожалуйста, выберите файл с правильным расширением.",maxlength:a.validator.format("Пожалуйста, введите не больше {0} символов."),minlength:a.validator.format("Пожалуйста, введите не меньше {0} символов."),rangelength:a.validator.format("Пожалуйста, введите значение длиной от {0} до {1} символов."),range:a.validator.format("Пожалуйста, введите число от {0} до {1}."),max:a.validator.format("Пожалуйста, введите число, меньшее или равное {0}."),min:a.validator.format("Пожалуйста, введите число, большее или равное {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_si.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_si.js
deleted file mode 100644
index 8e04a9d5..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_si.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: SI (Slovenian)
- */
-$.extend($.validator.messages, {
- required: "To polje je obvezno.",
- remote: "Vpis v tem polju ni v pravi obliki.",
- email: "Prosimo, vnesite pravi email naslov.",
- url: "Prosimo, vnesite pravi URL.",
- date: "Prosimo, vnesite pravi datum.",
- dateISO: "Prosimo, vnesite pravi datum (ISO).",
- number: "Prosimo, vnesite pravo številko.",
- digits: "Prosimo, vnesite samo številke.",
- creditcard: "Prosimo, vnesite pravo številko kreditne kartice.",
- equalTo: "Prosimo, ponovno vnesite enako vsebino.",
- extension: "Prosimo, vnesite vsebino z pravo končnico.",
- maxlength: $.validator.format("Prosimo, da ne vnašate več kot {0} znakov."),
- minlength: $.validator.format("Prosimo, vnesite vsaj {0} znakov."),
- rangelength: $.validator.format("Prosimo, vnesite od {0} do {1} znakov."),
- range: $.validator.format("Prosimo, vnesite vrednost med {0} in {1}."),
- max: $.validator.format("Prosimo, vnesite vrednost manjšo ali enako {0}."),
- min: $.validator.format("Prosimo, vnesite vrednost večjo ali enako {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_si.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_si.min.js
deleted file mode 100644
index fa01417e..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_si.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"To polje je obvezno.",remote:"Vpis v tem polju ni v pravi obliki.",email:"Prosimo, vnesite pravi email naslov.",url:"Prosimo, vnesite pravi URL.",date:"Prosimo, vnesite pravi datum.",dateISO:"Prosimo, vnesite pravi datum (ISO).",number:"Prosimo, vnesite pravo številko.",digits:"Prosimo, vnesite samo številke.",creditcard:"Prosimo, vnesite pravo številko kreditne kartice.",equalTo:"Prosimo, ponovno vnesite enako vsebino.",extension:"Prosimo, vnesite vsebino z pravo končnico.",maxlength:a.validator.format("Prosimo, da ne vnašate več kot {0} znakov."),minlength:a.validator.format("Prosimo, vnesite vsaj {0} znakov."),rangelength:a.validator.format("Prosimo, vnesite od {0} do {1} znakov."),range:a.validator.format("Prosimo, vnesite vrednost med {0} in {1}."),max:a.validator.format("Prosimo, vnesite vrednost manjšo ali enako {0}."),min:a.validator.format("Prosimo, vnesite vrednost večjo ali enako {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sk.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sk.js
deleted file mode 100644
index cf3680eb..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sk.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: SK (Slovak; slovenčina, slovenský jazyk)
- */
-$.extend($.validator.messages, {
- required: "Povinné zadať.",
- maxlength: $.validator.format("Maximálne {0} znakov."),
- minlength: $.validator.format("Minimálne {0} znakov."),
- rangelength: $.validator.format("Minimálne {0} a Maximálne {1} znakov."),
- email: "E-mailová adresa musí byť platná.",
- url: "URL musí byť platný.",
- date: "Musí byť dátum.",
- number: "Musí byť číslo.",
- digits: "Môže obsahovať iba číslice.",
- equalTo: "Dva hodnoty sa musia rovnať.",
- range: $.validator.format("Musí byť medzi {0} a {1}."),
- max: $.validator.format("Nemôže byť viac ako{0}."),
- min: $.validator.format("Nemôže byť menej ako{0}."),
- creditcard: "Číslo platobnej karty musí byť platné."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sk.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sk.min.js
deleted file mode 100644
index b586b0e2..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sk.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Povinné zadať.",maxlength:a.validator.format("Maximálne {0} znakov."),minlength:a.validator.format("Minimálne {0} znakov."),rangelength:a.validator.format("Minimálne {0} a Maximálne {1} znakov."),email:"E-mailová adresa musí byť platná.",url:"URL musí byť platný.",date:"Musí byť dátum.",number:"Musí byť číslo.",digits:"Môže obsahovať iba číslice.",equalTo:"Dva hodnoty sa musia rovnať.",range:a.validator.format("Musí byť medzi {0} a {1}."),max:a.validator.format("Nemôže byť viac ako{0}."),min:a.validator.format("Nemôže byť menej ako{0}."),creditcard:"Číslo platobnej karty musí byť platné."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sl.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sl.js
deleted file mode 100644
index 6eb9e0b2..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sl.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Language: SL (Slovenian; slovenski jezik)
- */
-$.extend($.validator.messages, {
- required: "To polje je obvezno.",
- remote: "Prosimo popravite to polje.",
- email: "Prosimo vnesite veljaven email naslov.",
- url: "Prosimo vnesite veljaven URL naslov.",
- date: "Prosimo vnesite veljaven datum.",
- dateISO: "Prosimo vnesite veljaven ISO datum.",
- number: "Prosimo vnesite veljavno število.",
- digits: "Prosimo vnesite samo števila.",
- creditcard: "Prosimo vnesite veljavno številko kreditne kartice.",
- equalTo: "Prosimo ponovno vnesite vrednost.",
- extension: "Prosimo vnesite vrednost z veljavno končnico.",
- maxlength: $.validator.format("Prosimo vnesite največ {0} znakov."),
- minlength: $.validator.format("Prosimo vnesite najmanj {0} znakov."),
- rangelength: $.validator.format("Prosimo vnesite najmanj {0} in največ {1} znakov."),
- range: $.validator.format("Prosimo vnesite vrednost med {0} in {1}."),
- max: $.validator.format("Prosimo vnesite vrednost manjše ali enako {0}."),
- min: $.validator.format("Prosimo vnesite vrednost večje ali enako {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sl.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sl.min.js
deleted file mode 100644
index f5009d6d..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sl.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"To polje je obvezno.",remote:"Prosimo popravite to polje.",email:"Prosimo vnesite veljaven email naslov.",url:"Prosimo vnesite veljaven URL naslov.",date:"Prosimo vnesite veljaven datum.",dateISO:"Prosimo vnesite veljaven ISO datum.",number:"Prosimo vnesite veljavno število.",digits:"Prosimo vnesite samo števila.",creditcard:"Prosimo vnesite veljavno številko kreditne kartice.",equalTo:"Prosimo ponovno vnesite vrednost.",extension:"Prosimo vnesite vrednost z veljavno končnico.",maxlength:a.validator.format("Prosimo vnesite največ {0} znakov."),minlength:a.validator.format("Prosimo vnesite najmanj {0} znakov."),rangelength:a.validator.format("Prosimo vnesite najmanj {0} in največ {1} znakov."),range:a.validator.format("Prosimo vnesite vrednost med {0} in {1}."),max:a.validator.format("Prosimo vnesite vrednost manjše ali enako {0}."),min:a.validator.format("Prosimo vnesite vrednost večje ali enako {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr.js
deleted file mode 100644
index e268be82..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: SR (Serbian; српски језик)
- */
-$.extend($.validator.messages, {
- required: "Поље је обавезно.",
- remote: "Средите ово поље.",
- email: "Унесите исправну и-мејл адресу.",
- url: "Унесите исправан URL.",
- date: "Унесите исправан датум.",
- dateISO: "Унесите исправан датум (ISO).",
- number: "Унесите исправан број.",
- digits: "Унесите само цифе.",
- creditcard: "Унесите исправан број кредитне картице.",
- equalTo: "Унесите исту вредност поново.",
- extension: "Унесите вредност са одговарајућом екстензијом.",
- maxlength: $.validator.format("Унесите мање од {0} карактера."),
- minlength: $.validator.format("Унесите барем {0} карактера."),
- rangelength: $.validator.format("Унесите вредност дугачку између {0} и {1} карактера."),
- range: $.validator.format("Унесите вредност између {0} и {1}."),
- max: $.validator.format("Унесите вредност мању или једнаку {0}."),
- min: $.validator.format("Унесите вредност већу или једнаку {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr.min.js
deleted file mode 100644
index 325b44c4..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Поље је обавезно.",remote:"Средите ово поље.",email:"Унесите исправну и-мејл адресу.",url:"Унесите исправан URL.",date:"Унесите исправан датум.",dateISO:"Унесите исправан датум (ISO).",number:"Унесите исправан број.",digits:"Унесите само цифе.",creditcard:"Унесите исправан број кредитне картице.",equalTo:"Унесите исту вредност поново.",extension:"Унесите вредност са одговарајућом екстензијом.",maxlength:a.validator.format("Унесите мање од {0} карактера."),minlength:a.validator.format("Унесите барем {0} карактера."),rangelength:a.validator.format("Унесите вредност дугачку између {0} и {1} карактера."),range:a.validator.format("Унесите вредност између {0} и {1}."),max:a.validator.format("Унесите вредност мању или једнаку {0}."),min:a.validator.format("Унесите вредност већу или једнаку {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr_lat.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr_lat.js
deleted file mode 100644
index fbcb7d3a..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr_lat.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: SR (Serbian - Latin alphabet; srpski jezik - latinica)
- */
-$.extend($.validator.messages, {
- required: "Polje je obavezno.",
- remote: "Sredite ovo polje.",
- email: "Unesite ispravnu e-mail adresu",
- url: "Unesite ispravan URL.",
- date: "Unesite ispravan datum.",
- dateISO: "Unesite ispravan datum (ISO).",
- number: "Unesite ispravan broj.",
- digits: "Unesite samo cifre.",
- creditcard: "Unesite ispravan broj kreditne kartice.",
- equalTo: "Unesite istu vrednost ponovo.",
- extension: "Unesite vrednost sa odgovarajućom ekstenzijom.",
- maxlength: $.validator.format("Unesite manje od {0} karaktera."),
- minlength: $.validator.format("Unesite barem {0} karaktera."),
- rangelength: $.validator.format("Unesite vrednost dugačku između {0} i {1} karaktera."),
- range: $.validator.format("Unesite vrednost između {0} i {1}."),
- max: $.validator.format("Unesite vrednost manju ili jednaku {0}."),
- min: $.validator.format("Unesite vrednost veću ili jednaku {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr_lat.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr_lat.min.js
deleted file mode 100644
index 6fa3800a..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sr_lat.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Polje je obavezno.",remote:"Sredite ovo polje.",email:"Unesite ispravnu e-mail adresu",url:"Unesite ispravan URL.",date:"Unesite ispravan datum.",dateISO:"Unesite ispravan datum (ISO).",number:"Unesite ispravan broj.",digits:"Unesite samo cifre.",creditcard:"Unesite ispravan broj kreditne kartice.",equalTo:"Unesite istu vrednost ponovo.",extension:"Unesite vrednost sa odgovarajućom ekstenzijom.",maxlength:a.validator.format("Unesite manje od {0} karaktera."),minlength:a.validator.format("Unesite barem {0} karaktera."),rangelength:a.validator.format("Unesite vrednost dugačku između {0} i {1} karaktera."),range:a.validator.format("Unesite vrednost između {0} i {1}."),max:a.validator.format("Unesite vrednost manju ili jednaku {0}."),min:a.validator.format("Unesite vrednost veću ili jednaku {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sv.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sv.js
deleted file mode 100644
index 758c8a72..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sv.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: SV (Swedish; Svenska)
- */
-$.extend($.validator.messages, {
- required: "Detta f&auml;lt &auml;r obligatoriskt.",
- maxlength: $.validator.format("Du f&aring;r ange h&ouml;gst {0} tecken."),
- minlength: $.validator.format("Du m&aring;ste ange minst {0} tecken."),
- rangelength: $.validator.format("Ange minst {0} och max {1} tecken."),
- email: "Ange en korrekt e-postadress.",
- url: "Ange en korrekt URL.",
- date: "Ange ett korrekt datum.",
- dateISO: "Ange ett korrekt datum (&Aring;&Aring;&Aring;&Aring;-MM-DD).",
- number: "Ange ett korrekt nummer.",
- digits: "Ange endast siffror.",
- equalTo: "Ange samma v&auml;rde igen.",
- range: $.validator.format("Ange ett v&auml;rde mellan {0} och {1}."),
- max: $.validator.format("Ange ett v&auml;rde som &auml;r mindre eller lika med {0}."),
- min: $.validator.format("Ange ett v&auml;rde som &auml;r st&ouml;rre eller lika med {0}."),
- creditcard: "Ange ett korrekt kreditkortsnummer."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sv.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sv.min.js
deleted file mode 100644
index 62f31013..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_sv.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Detta f&auml;lt &auml;r obligatoriskt.",maxlength:a.validator.format("Du f&aring;r ange h&ouml;gst {0} tecken."),minlength:a.validator.format("Du m&aring;ste ange minst {0} tecken."),rangelength:a.validator.format("Ange minst {0} och max {1} tecken."),email:"Ange en korrekt e-postadress.",url:"Ange en korrekt URL.",date:"Ange ett korrekt datum.",dateISO:"Ange ett korrekt datum (&Aring;&Aring;&Aring;&Aring;-MM-DD).",number:"Ange ett korrekt nummer.",digits:"Ange endast siffror.",equalTo:"Ange samma v&auml;rde igen.",range:a.validator.format("Ange ett v&auml;rde mellan {0} och {1}."),max:a.validator.format("Ange ett v&auml;rde som &auml;r mindre eller lika med {0}."),min:a.validator.format("Ange ett v&auml;rde som &auml;r st&ouml;rre eller lika med {0}."),creditcard:"Ange ett korrekt kreditkortsnummer."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_th.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_th.js
deleted file mode 100644
index e354e50a..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_th.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: TH (Thai; ไทย)
- */
-$.extend($.validator.messages, {
- required: "โปรดระบุ",
- remote: "โปรดแก้ไขให้ถูกต้อง",
- email: "โปรดระบุที่อยู่อีเมล์ที่ถูกต้อง",
- url: "โปรดระบุ URL ที่ถูกต้อง",
- date: "โปรดระบุวันที่ ที่ถูกต้อง",
- dateISO: "โปรดระบุวันที่ ที่ถูกต้อง (ระบบ ISO).",
- number: "โปรดระบุทศนิยมที่ถูกต้อง",
- digits: "โปรดระบุจำนวนเต็มที่ถูกต้อง",
- creditcard: "โปรดระบุรหัสบัตรเครดิตที่ถูกต้อง",
- equalTo: "โปรดระบุค่าเดิมอีกครั้ง",
- extension: "โปรดระบุค่าที่มีส่วนขยายที่ถูกต้อง",
- maxlength: $.validator.format("โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ"),
- minlength: $.validator.format("โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ"),
- rangelength: $.validator.format("โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ"),
- range: $.validator.format("โปรดระบุค่าระหว่าง {0} และ {1}"),
- max: $.validator.format("โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}"),
- min: $.validator.format("โปรดระบุค่ามากกว่าหรือเท่ากับ {0}")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_th.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_th.min.js
deleted file mode 100644
index 44780a94..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_th.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"โปรดระบุ",remote:"โปรดแก้ไขให้ถูกต้อง",email:"โปรดระบุที่อยู่อีเมล์ที่ถูกต้อง",url:"โปรดระบุ URL ที่ถูกต้อง",date:"โปรดระบุวันที่ ที่ถูกต้อง",dateISO:"โปรดระบุวันที่ ที่ถูกต้อง (ระบบ ISO).",number:"โปรดระบุทศนิยมที่ถูกต้อง",digits:"โปรดระบุจำนวนเต็มที่ถูกต้อง",creditcard:"โปรดระบุรหัสบัตรเครดิตที่ถูกต้อง",equalTo:"โปรดระบุค่าเดิมอีกครั้ง",extension:"โปรดระบุค่าที่มีส่วนขยายที่ถูกต้อง",maxlength:a.validator.format("โปรดอย่าระบุค่าที่ยาวกว่า {0} อักขระ"),minlength:a.validator.format("โปรดอย่าระบุค่าที่สั้นกว่า {0} อักขระ"),rangelength:a.validator.format("โปรดอย่าระบุค่าความยาวระหว่าง {0} ถึง {1} อักขระ"),range:a.validator.format("โปรดระบุค่าระหว่าง {0} และ {1}"),max:a.validator.format("โปรดระบุค่าน้อยกว่าหรือเท่ากับ {0}"),min:a.validator.format("โปรดระบุค่ามากกว่าหรือเท่ากับ {0}")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tj.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tj.js
deleted file mode 100644
index 67e1e2ca..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tj.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: TJ (Tajikistan; Забони тоҷикӣ)
- */
-$.extend($.validator.messages, {
- required: "Ворид кардани ин филд маҷбури аст.",
- remote: "Илтимос, маълумоти саҳеҳ ворид кунед.",
- email: "Илтимос, почтаи электронии саҳеҳ ворид кунед.",
- url: "Илтимос, URL адреси саҳеҳ ворид кунед.",
- date: "Илтимос, таърихи саҳеҳ ворид кунед.",
- dateISO: "Илтимос, таърихи саҳеҳи (ISO)ӣ ворид кунед.",
- number: "Илтимос, рақамҳои саҳеҳ ворид кунед.",
- digits: "Илтимос, танҳо рақам ворид кунед.",
- creditcard: "Илтимос, кредит карди саҳеҳ ворид кунед.",
- equalTo: "Илтимос, миқдори баробар ворид кунед.",
- extension: "Илтимос, қофияи файлро дуруст интихоб кунед",
- maxlength: $.validator.format("Илтимос, бештар аз {0} рамз ворид накунед."),
- minlength: $.validator.format("Илтимос, камтар аз {0} рамз ворид накунед."),
- rangelength: $.validator.format("Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед."),
- range: $.validator.format("Илтимос, аз {0} то {1} рақам зиёд ворид кунед."),
- max: $.validator.format("Илтимос, бештар аз {0} рақам ворид накунед."),
- min: $.validator.format("Илтимос, камтар аз {0} рақам ворид накунед.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tj.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tj.min.js
deleted file mode 100644
index 59828ba1..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tj.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Ворид кардани ин филд маҷбури аст.",remote:"Илтимос, маълумоти саҳеҳ ворид кунед.",email:"Илтимос, почтаи электронии саҳеҳ ворид кунед.",url:"Илтимос, URL адреси саҳеҳ ворид кунед.",date:"Илтимос, таърихи саҳеҳ ворид кунед.",dateISO:"Илтимос, таърихи саҳеҳи (ISO)ӣ ворид кунед.",number:"Илтимос, рақамҳои саҳеҳ ворид кунед.",digits:"Илтимос, танҳо рақам ворид кунед.",creditcard:"Илтимос, кредит карди саҳеҳ ворид кунед.",equalTo:"Илтимос, миқдори баробар ворид кунед.",extension:"Илтимос, қофияи файлро дуруст интихоб кунед",maxlength:a.validator.format("Илтимос, бештар аз {0} рамз ворид накунед."),minlength:a.validator.format("Илтимос, камтар аз {0} рамз ворид накунед."),rangelength:a.validator.format("Илтимос, камтар аз {0} ва зиёда аз {1} рамз ворид кунед."),range:a.validator.format("Илтимос, аз {0} то {1} рақам зиёд ворид кунед."),max:a.validator.format("Илтимос, бештар аз {0} рақам ворид накунед."),min:a.validator.format("Илтимос, камтар аз {0} рақам ворид накунед.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tr.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tr.js
deleted file mode 100644
index f7344a8c..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tr.js
+++ /dev/null
@@ -1,34 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: TR (Turkish; Türkçe)
- */
-$.extend($.validator.messages, {
- required: "Bu alanın doldurulması zorunludur.",
- remote: "Lütfen bu alanı düzeltin.",
- email: "Lütfen geçerli bir e-posta adresi giriniz.",
- url: "Lütfen geçerli bir web adresi (URL) giriniz.",
- date: "Lütfen geçerli bir tarih giriniz.",
- dateISO: "Lütfen geçerli bir tarih giriniz(ISO formatında)",
- number: "Lütfen geçerli bir sayı giriniz.",
- digits: "Lütfen sadece sayısal karakterler giriniz.",
- creditcard: "Lütfen geçerli bir kredi kartı giriniz.",
- equalTo: "Lütfen aynı değeri tekrar giriniz.",
- extension: "Lütfen geçerli uzantıya sahip bir değer giriniz.",
- maxlength: $.validator.format("Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz."),
- minlength: $.validator.format("Lütfen en az {0} karakter uzunluğunda bir değer giriniz."),
- rangelength: $.validator.format("Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz."),
- range: $.validator.format("Lütfen {0} ile {1} arasında bir değer giriniz."),
- max: $.validator.format("Lütfen {0} değerine eşit ya da daha küçük bir değer giriniz."),
- min: $.validator.format("Lütfen {0} değerine eşit ya da daha büyük bir değer giriniz."),
- require_from_group: "Lütfen bu alanların en az {0} tanesini doldurunuz."
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tr.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tr.min.js
deleted file mode 100644
index a8cf8fea..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_tr.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Bu alanın doldurulması zorunludur.",remote:"Lütfen bu alanı düzeltin.",email:"Lütfen geçerli bir e-posta adresi giriniz.",url:"Lütfen geçerli bir web adresi (URL) giriniz.",date:"Lütfen geçerli bir tarih giriniz.",dateISO:"Lütfen geçerli bir tarih giriniz(ISO formatında)",number:"Lütfen geçerli bir sayı giriniz.",digits:"Lütfen sadece sayısal karakterler giriniz.",creditcard:"Lütfen geçerli bir kredi kartı giriniz.",equalTo:"Lütfen aynı değeri tekrar giriniz.",extension:"Lütfen geçerli uzantıya sahip bir değer giriniz.",maxlength:a.validator.format("Lütfen en fazla {0} karakter uzunluğunda bir değer giriniz."),minlength:a.validator.format("Lütfen en az {0} karakter uzunluğunda bir değer giriniz."),rangelength:a.validator.format("Lütfen en az {0} ve en fazla {1} uzunluğunda bir değer giriniz."),range:a.validator.format("Lütfen {0} ile {1} arasında bir değer giriniz."),max:a.validator.format("Lütfen {0} değerine eşit ya da daha küçük bir değer giriniz."),min:a.validator.format("Lütfen {0} değerine eşit ya da daha büyük bir değer giriniz."),require_from_group:"Lütfen bu alanların en az {0} tanesini doldurunuz."})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_uk.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_uk.js
deleted file mode 100644
index ecb855cc..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_uk.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: UK (Ukrainian; українська мова)
- */
-$.extend($.validator.messages, {
- required: "Це поле необхідно заповнити.",
- remote: "Будь ласка, введіть правильне значення.",
- email: "Будь ласка, введіть коректну адресу електронної пошти.",
- url: "Будь ласка, введіть коректний URL.",
- date: "Будь ласка, введіть коректну дату.",
- dateISO: "Будь ласка, введіть коректну дату у форматі ISO.",
- number: "Будь ласка, введіть число.",
- digits: "Вводите потрібно лише цифри.",
- creditcard: "Будь ласка, введіть правильний номер кредитної карти.",
- equalTo: "Будь ласка, введіть таке ж значення ще раз.",
- extension: "Будь ласка, виберіть файл з правильним розширенням.",
- maxlength: $.validator.format("Будь ласка, введіть не більше {0} символів."),
- minlength: $.validator.format("Будь ласка, введіть не менше {0} символів."),
- rangelength: $.validator.format("Будь ласка, введіть значення довжиною від {0} до {1} символів."),
- range: $.validator.format("Будь ласка, введіть число від {0} до {1}."),
- max: $.validator.format("Будь ласка, введіть число, менше або рівно {0}."),
- min: $.validator.format("Будь ласка, введіть число, більше або рівно {0}.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_uk.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_uk.min.js
deleted file mode 100644
index 39607644..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_uk.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Це поле необхідно заповнити.",remote:"Будь ласка, введіть правильне значення.",email:"Будь ласка, введіть коректну адресу електронної пошти.",url:"Будь ласка, введіть коректний URL.",date:"Будь ласка, введіть коректну дату.",dateISO:"Будь ласка, введіть коректну дату у форматі ISO.",number:"Будь ласка, введіть число.",digits:"Вводите потрібно лише цифри.",creditcard:"Будь ласка, введіть правильний номер кредитної карти.",equalTo:"Будь ласка, введіть таке ж значення ще раз.",extension:"Будь ласка, виберіть файл з правильним розширенням.",maxlength:a.validator.format("Будь ласка, введіть не більше {0} символів."),minlength:a.validator.format("Будь ласка, введіть не менше {0} символів."),rangelength:a.validator.format("Будь ласка, введіть значення довжиною від {0} до {1} символів."),range:a.validator.format("Будь ласка, введіть число від {0} до {1}."),max:a.validator.format("Будь ласка, введіть число, менше або рівно {0}."),min:a.validator.format("Будь ласка, введіть число, більше або рівно {0}.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_vi.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_vi.js
deleted file mode 100644
index f37b00e8..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_vi.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: VI (Vietnamese; Tiếng Việt)
- */
-$.extend($.validator.messages, {
- required: "Hãy nhập.",
- remote: "Hãy sửa cho đúng.",
- email: "Hãy nhập email.",
- url: "Hãy nhập URL.",
- date: "Hãy nhập ngày.",
- dateISO: "Hãy nhập ngày (ISO).",
- number: "Hãy nhập số.",
- digits: "Hãy nhập chữ số.",
- creditcard: "Hãy nhập số thẻ tín dụng.",
- equalTo: "Hãy nhập thêm lần nữa.",
- extension: "Phần mở rộng không đúng.",
- maxlength: $.validator.format("Hãy nhập từ {0} kí tự trở xuống."),
- minlength: $.validator.format("Hãy nhập từ {0} kí tự trở lên."),
- rangelength: $.validator.format("Hãy nhập từ {0} đến {1} kí tự."),
- range: $.validator.format("Hãy nhập từ {0} đến {1}."),
- max: $.validator.format("Hãy nhập từ {0} trở xuống."),
- min: $.validator.format("Hãy nhập từ {1} trở lên.")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_vi.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_vi.min.js
deleted file mode 100644
index 831b108f..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_vi.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"Hãy nhập.",remote:"Hãy sửa cho đúng.",email:"Hãy nhập email.",url:"Hãy nhập URL.",date:"Hãy nhập ngày.",dateISO:"Hãy nhập ngày (ISO).",number:"Hãy nhập số.",digits:"Hãy nhập chữ số.",creditcard:"Hãy nhập số thẻ tín dụng.",equalTo:"Hãy nhập thêm lần nữa.",extension:"Phần mở rộng không đúng.",maxlength:a.validator.format("Hãy nhập từ {0} kí tự trở xuống."),minlength:a.validator.format("Hãy nhập từ {0} kí tự trở lên."),rangelength:a.validator.format("Hãy nhập từ {0} đến {1} kí tự."),range:a.validator.format("Hãy nhập từ {0} đến {1}."),max:a.validator.format("Hãy nhập từ {0} trở xuống."),min:a.validator.format("Hãy nhập từ {1} trở lên.")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh.js
deleted file mode 100644
index 41c1bf83..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: ZH (Chinese, 中文 (Zhōngwén), 汉语, 漢語)
- */
-$.extend($.validator.messages, {
- required: "这是必填字段",
- remote: "请修正此字段",
- email: "请输入有效的电子邮件地址",
- url: "请输入有效的网址",
- date: "请输入有效的日期",
- dateISO: "请输入有效的日期 (YYYY-MM-DD)",
- number: "请输入有效的数字",
- digits: "只能输入数字",
- creditcard: "请输入有效的信用卡号码",
- equalTo: "你的输入不相同",
- extension: "请输入有效的后缀",
- maxlength: $.validator.format("最多可以输入 {0} 个字符"),
- minlength: $.validator.format("最少要输入 {0} 个字符"),
- rangelength: $.validator.format("请输入长度在 {0} 到 {1} 之间的字符串"),
- range: $.validator.format("请输入范围在 {0} 到 {1} 之间的数值"),
- max: $.validator.format("请输入不大于 {0} 的数值"),
- min: $.validator.format("请输入不小于 {0} 的数值")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh.min.js
deleted file mode 100644
index 8ca93f22..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"这是必填字段",remote:"请修正此字段",email:"请输入有效的电子邮件地址",url:"请输入有效的网址",date:"请输入有效的日期",dateISO:"请输入有效的日期 (YYYY-MM-DD)",number:"请输入有效的数字",digits:"只能输入数字",creditcard:"请输入有效的信用卡号码",equalTo:"你的输入不相同",extension:"请输入有效的后缀",maxlength:a.validator.format("最多可以输入 {0} 个字符"),minlength:a.validator.format("最少要输入 {0} 个字符"),rangelength:a.validator.format("请输入长度在 {0} 到 {1} 之间的字符串"),range:a.validator.format("请输入范围在 {0} 到 {1} 之间的数值"),max:a.validator.format("请输入不大于 {0} 的数值"),min:a.validator.format("请输入不小于 {0} 的数值")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh_TW.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh_TW.js
deleted file mode 100644
index fc86be39..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh_TW.js
+++ /dev/null
@@ -1,34 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Translated default messages for the jQuery validation plugin.
- * Locale: ZH (Chinese; 中文 (Zhōngwén), 汉语, 漢語)
- * Region: TW (Taiwan)
- */
-$.extend($.validator.messages, {
- required: "必須填寫",
- remote: "請修正此欄位",
- email: "請輸入有效的電子郵件",
- url: "請輸入有效的網址",
- date: "請輸入有效的日期",
- dateISO: "請輸入有效的日期 (YYYY-MM-DD)",
- number: "請輸入正確的數值",
- digits: "只可輸入數字",
- creditcard: "請輸入有效的信用卡號碼",
- equalTo: "請重複輸入一次",
- extension: "請輸入有效的後綴",
- maxlength: $.validator.format("最多 {0} 個字"),
- minlength: $.validator.format("最少 {0} 個字"),
- rangelength: $.validator.format("請輸入長度為 {0} 至 {1} 之間的字串"),
- range: $.validator.format("請輸入 {0} 至 {1} 之間的數值"),
- max: $.validator.format("請輸入不大於 {0} 的數值"),
- min: $.validator.format("請輸入不小於 {0} 的數值")
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh_TW.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh_TW.min.js
deleted file mode 100644
index da54115c..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/messages_zh_TW.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.messages,{required:"必須填寫",remote:"請修正此欄位",email:"請輸入有效的電子郵件",url:"請輸入有效的網址",date:"請輸入有效的日期",dateISO:"請輸入有效的日期 (YYYY-MM-DD)",number:"請輸入正確的數值",digits:"只可輸入數字",creditcard:"請輸入有效的信用卡號碼",equalTo:"請重複輸入一次",extension:"請輸入有效的後綴",maxlength:a.validator.format("最多 {0} 個字"),minlength:a.validator.format("最少 {0} 個字"),rangelength:a.validator.format("請輸入長度為 {0} 至 {1} 之間的字串"),range:a.validator.format("請輸入 {0} 至 {1} 之間的數值"),max:a.validator.format("請輸入不大於 {0} 的數值"),min:a.validator.format("請輸入不小於 {0} 的數值")})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_de.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_de.js
deleted file mode 100644
index 470133ed..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_de.js
+++ /dev/null
@@ -1,22 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Localized default methods for the jQuery validation plugin.
- * Locale: DE
- */
-$.extend($.validator.methods, {
- date: function(value, element) {
- return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
- },
- number: function(value, element) {
- return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
- }
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_de.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_de.min.js
deleted file mode 100644
index 114e83fa..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_de.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_es_CL.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_es_CL.js
deleted file mode 100644
index 16446e44..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_es_CL.js
+++ /dev/null
@@ -1,22 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Localized default methods for the jQuery validation plugin.
- * Locale: ES_CL
- */
-$.extend($.validator.methods, {
- date: function(value, element) {
- return this.optional(element) || /^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(value);
- },
- number: function(value, element) {
- return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
- }
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_es_CL.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_es_CL.min.js
deleted file mode 100644
index cc54741c..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_es_CL.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\-\d\d?\-\d\d\d?\d?$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(a)}})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_fi.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_fi.js
deleted file mode 100644
index 44b3e365..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_fi.js
+++ /dev/null
@@ -1,22 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Localized default methods for the jQuery validation plugin.
- * Locale: FI
- */
-$.extend($.validator.methods, {
- date: function(value, element) {
- return this.optional(element) || /^\d{1,2}\.\d{1,2}\.\d{4}$/.test(value);
- },
- number: function(value, element) {
- return this.optional(element) || /^-?(?:\d+)(?:,\d+)?$/.test(value);
- }
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_fi.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_fi.min.js
deleted file mode 100644
index f135efff..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_fi.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d{1,2}\.\d{1,2}\.\d{4}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+)(?:,\d+)?$/.test(a)}})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_nl.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_nl.js
deleted file mode 100644
index 91e0d8c5..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_nl.js
+++ /dev/null
@@ -1,19 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Localized default methods for the jQuery validation plugin.
- * Locale: NL
- */
-$.extend($.validator.methods, {
- date: function(value, element) {
- return this.optional(element) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(value);
- }
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_nl.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_nl.min.js
deleted file mode 100644
index 020682e6..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_nl.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(a)}})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_pt.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_pt.js
deleted file mode 100644
index d06ccec8..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_pt.js
+++ /dev/null
@@ -1,19 +0,0 @@
-(function( factory ) {
- if ( typeof define === "function" && define.amd ) {
- define( ["jquery", "../jquery.validate"], factory );
- } else {
- factory( jQuery );
- }
-}(function( $ ) {
-
-/*
- * Localized default methods for the jQuery validation plugin.
- * Locale: PT_BR
- */
-$.extend($.validator.methods, {
- date: function(value, element) {
- return this.optional(element) || /^\d\d?\/\d\d?\/\d\d\d?\d?$/.test(value);
- }
-});
-
-})); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_pt.min.js b/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_pt.min.js
deleted file mode 100644
index a5af4462..00000000
--- a/wqflask/wqflask/static/new/packages/ValidationPlugin/dist/localization/methods_pt.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery Validation Plugin - v1.14.0 - 6/30/2015
- * http://jqueryvalidation.org/
- * Copyright (c) 2015 Jörn Zaefferer; Licensed MIT */
-!function(a){"function"==typeof define&&define.amd?define(["jquery","../jquery.validate.min"],a):a(jQuery)}(function(a){a.extend(a.validator.methods,{date:function(a,b){return this.optional(b)||/^\d\d?\/\d\d?\/\d\d\d?\d?$/.test(a)}})}); \ No newline at end of file
diff --git a/wqflask/wqflask/static/new/packages/nvd3/nv.d3.css b/wqflask/wqflask/static/new/packages/nvd3/nv.d3.css
index 726f76c3..694b9218 100644
--- a/wqflask/wqflask/static/new/packages/nvd3/nv.d3.css
+++ b/wqflask/wqflask/static/new/packages/nvd3/nv.d3.css
@@ -16,7 +16,7 @@
}
.nvd3 .nv-axis.nv-x path.domain {
- stroke-opacity: 0;
+ stroke-opacity: 1;
}
.nvd3 .nv-axis line {
diff --git a/wqflask/wqflask/static/new/packages/nvd3/nv.d3.js b/wqflask/wqflask/static/new/packages/nvd3/nv.d3.js
index b11ce58f..4d8b9d65 100644
--- a/wqflask/wqflask/static/new/packages/nvd3/nv.d3.js
+++ b/wqflask/wqflask/static/new/packages/nvd3/nv.d3.js
@@ -1556,7 +1556,7 @@ nv.models.axis = function() {
, width = 75 //only used for tickLabel currently
, height = 60 //only used for tickLabel currently
, axisLabelText = null
- , showMaxMin = true //TODO: showMaxMin should be disabled on all ordinal scaled axes
+ , showMaxMin = false //TODO: showMaxMin should be disabled on all ordinal scaled axes
, rotateLabels = 0
, rotateYLabel = true
, staggerLabels = false
@@ -7894,7 +7894,8 @@ nv.models.multiBar = function() {
bars.select('polyline')
.attr('fill', 'none')
- .attr('stroke', function(d, i, j) { return errorBarColor(d, j, i); })
+ .attr('stroke', 'black')
+ //.attr('stroke', function(d, i, j) { return errorBarColor(d, j, i); })
.attr('points', function(d,i) {
var yerr = getYerr(d,i)
, mid = 0.8 * x.rangeBand() / ((stacked ? 1 : data.length) * 2);
diff --git a/wqflask/wqflask/static/output/Itvl_3kiKQR1g.jpeg b/wqflask/wqflask/static/output/Itvl_3kiKQR1g.jpeg
new file mode 100644
index 00000000..bdd94651
--- /dev/null
+++ b/wqflask/wqflask/static/output/Itvl_3kiKQR1g.jpeg
Binary files differ
diff --git a/wqflask/wqflask/static/output/Itvl_hNsk2rxO.jpeg b/wqflask/wqflask/static/output/Itvl_hNsk2rxO.jpeg
new file mode 100644
index 00000000..bdd94651
--- /dev/null
+++ b/wqflask/wqflask/static/output/Itvl_hNsk2rxO.jpeg
Binary files differ
diff --git a/wqflask/wqflask/static/packages/bootstrap/css/docs.css b/wqflask/wqflask/static/packages/bootstrap/css/docs.css
index 2d6a713c..31616821 100755
--- a/wqflask/wqflask/static/packages/bootstrap/css/docs.css
+++ b/wqflask/wqflask/static/packages/bootstrap/css/docs.css
@@ -94,7 +94,7 @@ hr.soften {
.jumbotron {
position: relative;
padding: 0px 0;
- color: #336699;
+ color: black;
text-align: left;
text-shadow: 0 1px 3px rgba(0,0,0,.4), 0 0 30px rgba(0,0,0,.075);
background: #d5d5d5; /* Old browsers */
@@ -107,7 +107,7 @@ hr.soften {
line-height: 1;
}
.jumbotron p {
- font-size: 15px;
+ font-size: 20px;
font-weight: 300;
line-height: 20px;
margin-bottom: 10px;
diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html
index f25bf9f7..759c4a8d 100755
--- a/wqflask/wqflask/templates/base.html
+++ b/wqflask/wqflask/templates/base.html
@@ -19,7 +19,7 @@
</head>
-<body style="width: 1500px !important;">
+<body style="width: 100% !important;">
<!-- Navbar ================================================== -->
<div class="navbar navbar-inverse navbar-static-top pull-left" role="navigation">
@@ -151,7 +151,7 @@
<!--</p>-->
<ul class="footer-links">
- <li><a href="http://atlas.uthsc.edu/mailman/listinfo/genenetwork" target="_blank">Join the mailing list</a></li>
+ <li><a href="http://listserv.uthsc.edu/mailman/listinfo/genenetwork-dev">Join the mailing list</a></li>
<!--<li><a href="#">Friend us on facebook</a></li>-->
<!--<li><a href="#">Follow us on twitter</a></li>-->
</ul>
diff --git a/wqflask/wqflask/templates/collections/list.html b/wqflask/wqflask/templates/collections/list.html
index 52106eae..0e7612aa 100755
--- a/wqflask/wqflask/templates/collections/list.html
+++ b/wqflask/wqflask/templates/collections/list.html
@@ -4,6 +4,7 @@
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
<link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" />
<link rel="stylesheet" type="text/css" href="/static/packages/TableTools/media/css/TableTools.css" />
+ <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" />
{% endblock %}
{% block content %}
<!-- Start of body -->
@@ -55,6 +56,10 @@
{% block js %}
<script type="text/javascript" src="/static/packages/smart-time-ago/lib/timeago.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.html5.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.naturalSort.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colResize.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colReorder.js"></script>
@@ -62,7 +67,15 @@
<script language="javascript" type="text/javascript" src="/static/packages/TableTools/media/js/TableTools.min.js"></script>
<script>
$('#trait_table').dataTable( {
- "sDom": "RZtir",
+ "buttons": [
+ {
+ extend: 'csvHtml5',
+ text: 'Download CSV',
+ title: 'collection_list',
+ fieldBoundary: '"'
+ }
+ ],
+ "sDom": "RZBtir",
"iDisplayLength": -1,
"autoWidth": true,
"bDeferRender": true,
diff --git a/wqflask/wqflask/templates/collections/view.html b/wqflask/wqflask/templates/collections/view.html
index 5450f903..288207e7 100755
--- a/wqflask/wqflask/templates/collections/view.html
+++ b/wqflask/wqflask/templates/collections/view.html
@@ -4,16 +4,21 @@
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
<link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" />
<link rel="stylesheet" type="text/css" href="/static/packages/TableTools/media/css/TableTools.css" />
+ <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" />
{% endblock %}
{% block content %}
<!-- Start of body -->
+
+ <div class="container">
{% if uc %}
- {{ header(uc.name,
- 'This collection has {}.'.format(numify(trait_obs|count, "record", "records"))) }}
+ <h2>{{ uc.name }}</h2>
+ <h3>{{ 'This collection has {}.'.format(numify(trait_obs|count, "record", "records")) }}</h3>
{% else %}
- {{ header('Your Collection',
- 'This collection has {}.'.format(numify(trait_obs|count, "record", "records"))) }}
+ <h2>Your Collection</h2>
+ <h3>{{ 'This collection has {}.'.format(numify(trait_obs|count, "record", "records")) }}</h3>
{% endif %}
+ </div>
+
<div class="container">
<div>
{% if uc %}
@@ -50,6 +55,18 @@
<input type="submit" class="btn btn-primary" value="WGCNA Analysis" />
</div>
</form>
+ <form action="/ctl_setup" method="post">
+ {% if uc %}
+ <input type="hidden" name="uc_id" id="uc_id" value="{{ uc.id }}" />
+ {% endif %}
+ <input type="hidden" name="trait_list" id="trait_list" value= "
+ {% for this_trait in trait_obs %}
+ {{ this_trait.name }}:{{ this_trait.dataset.name }},
+ {% endfor %}" >
+ <div class="col-xs-2 controls">
+ <input type="submit" class="btn btn-primary" value="CTL Analysis" />
+ </div>
+ </form>
<form action="/heatmap" method="post">
{% if uc %}
<input type="hidden" name="uc_id" id="uc_id" value="{{ uc.id }}" />
@@ -73,30 +90,32 @@
<button class="btn btn-default" id="invert"><span class="glyphicon glyphicon-resize-vertical"></span> Invert</button>
<button class="btn" id="add" disabled="disabled"><i class="icon-plus-sign"></i> Add Record to Other Collection</button>
<button class="btn" id="remove" disabled="disabled"><i class="icon-minus-sign"></i> Remove Record</button>
- <button class="btn btn-primary pull-right"><i class="icon-download icon-white"></i> Download Table</button>
<br />
<br />
+ <div style="background-color: #eeeeee; border: 1px solid black;">
<table class="table table-hover table-striped" id='trait_table'>
<thead>
<tr>
- <th>Index</th>
- <th>Record</th>
- <th>Description</th>
- <th>Location</th>
- <th>Mean</th>
- <th>Max LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
- <th>Max LRS Location</th>
- <th>Additive Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ <th style="background-color: #eeeeee;"></th>
+ <th style="background-color: #eeeeee;">Index</th>
+ <th style="background-color: #eeeeee;">Record</th>
+ <th style="background-color: #eeeeee;">Description</th>
+ <th style="background-color: #eeeeee;">Location</th>
+ <th style="background-color: #eeeeee;">Mean</th>
+ <th style="background-color: #eeeeee;">Max LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ <th style="background-color: #eeeeee;">Max LRS Location</th>
+ <th style="background-color: #eeeeee;">Additive Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
</tr>
</thead>
<tbody>
{% for this_trait in trait_obs %}
<TR id="trait:{{ this_trait.name }}:{{ this_trait.dataset.name }}">
- <TD>{{ loop.index }}
+ <TD>
<INPUT TYPE="checkbox" NAME="searchResult" class="checkbox trait_checkbox"
VALUE="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) }}">
</TD>
+ <TD>{{ loop.index }}</TD>
<TD>
<a href="{{ url_for('show_trait_page',
trait_id = this_trait.name,
@@ -118,6 +137,7 @@
</tbody>
</table>
+ </div>
<br />
</div>
</div>
@@ -129,6 +149,10 @@
{% block js %}
<script type="text/javascript" src="/static/new/javascript/search_results.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.html5.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.naturalSort.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colResize.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colReorder.js"></script>
@@ -150,6 +174,7 @@
"columns": [
{ "type": "natural" },
{ "type": "natural" },
+ { "type": "natural" },
{ "type": "natural",
"width": "35%" },
{ "type": "natural",
@@ -161,7 +186,18 @@
"width": "15%" },
{ "type": "natural" }
],
- "sDom": "ZRtir",
+ "buttons": [
+ {
+ extend: 'csvHtml5',
+ text: 'Download CSV',
+ title: 'collection',
+ fieldBoundary: '"',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5, 6, 7, 8]
+ }
+ }
+ ],
+ "sDom": "ZRBtir",
"iDisplayLength": -1,
"autoWidth": true,
"bDeferRender": true,
diff --git a/wqflask/wqflask/templates/correlation_page.html b/wqflask/wqflask/templates/correlation_page.html
index efc94c42..c5b4477b 100755
--- a/wqflask/wqflask/templates/correlation_page.html
+++ b/wqflask/wqflask/templates/correlation_page.html
@@ -3,8 +3,6 @@
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
<link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" />
<link rel="stylesheet" type="text/css" href="/static/packages/TableTools/media/css/TableTools.css" />
- <link href="//cdn.datatables.net/fixedheader/2.1.2/css/dataTables.fixedHeader.css" rel="stylesheet">
- <link href="//cdn.datatables.net/fixedcolumns/3.0.4/css/dataTables.fixedColumns.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" />
{% endblock %}
{% block content %}
@@ -34,55 +32,65 @@
<br />
<br />
- <div>
- <table id="trait_table" class="table table-hover table-striped">
+ <div style="width: {% if target_dataset.type == "ProbeSet" %}1600px{% elif target_dataset.type == "Publish" %}1200px{% else %}800px{% endif %}; background-color: #eeeeee; border: 1px solid black;">
+ <table width="1600px" id="trait_table" class="table table-hover table-striped">
<thead>
<tr>
- <th style="width: 30px;"></th>
+ <th style="width: 30px; background-color: #eeeeee;"></th>
{% for header in target_dataset.header_fields %}
- {% if header == 'Max LRS' %}
- <th style="text-align: right;">Max&nbsp;&nbsp;<br>LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ {% if header == 'Year' %}
+ <th style="text-align: right; background-color: #eeeeee;">{{header}}</th>
+ {% elif header == 'Max LRS' %}
+ <th style="text-align: right; background-color: #eeeeee;">Max&nbsp;&nbsp;<br>LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ {% elif header == 'Max LRS Location' %}
+ <th style="text-align: right; background-color: #eeeeee;">{{header}}</th>
+ {% elif header == 'Location' %}
+ <th style="text-align: right; background-color: #eeeeee;">{{header}}</th>
+ {% elif header == 'Mean' %}
+ <th style="text-align: right; background-color: #eeeeee;">{{header}}</th>
{% elif header == 'Additive Effect' %}
- <th style="text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ <th style="text-align: right; background-color: #eeeeee;">Add&nbsp;&nbsp;<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ {% elif header == 'Index' %}
+ <th style="text-align: right; background-color: #eeeeee; padding-left: 0px; margin-left: 0px;">{{header}}</th>
+ {% elif header == 'N' %}
+ <th style="text-align: right; background-color: #eeeeee;">{{header}}</th>
{% else %}
- <th>{{header}}</th>
+ <th style="background-color: #eeeeee;">{{header}}</th>
{% endif %}
{% endfor %}
- {% if target_dataset.type == "ProbeSet" %}
+ {% if target_dataset.type == "ProbeSet" %}
{% if corr_method == 'pearson' %}
- <th>Sample r</th>
- <th>N Cases</th>
- <th>Sample p(r)</th>
- <th>Lit Corr</th>
- <th>Tissue r</th>
- <th>Tissue p(r)</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample r</th>
+ <th style="text-align: right; background-color: #eeeeee;">&nbsp;&nbsp;N</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample p(r)</th>
+ <th style="text-align: right; background-color: #eeeeee;">Lit r</th>
+ <th style="text-align: right; background-color: #eeeeee;">Tissue r</th>
{% else %}
- <th>Sample rho</th>
- <th>N Cases</th>
- <th>Sample p(rho)</th>
- <th>Lit Corr</th>
- <th>Tissue rho</th>
- <th>Tissue p(rho)</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample rho</th>
+ <th style="text-align: right; background-color: #eeeeee;">N</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample p(rho)</th>
+ <th style="text-align: right; background-color: #eeeeee;">Lit r</th>
+ <th style="text-align: right; background-color: #eeeeee;">Tissue rho</th>
{% endif %}
{% elif target_dataset.type == "Publish" %}
{% if corr_method == 'pearson' %}
- <th>Sample r</th>
- <th>N Cases</th>
- <th>Sample p(r)</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample r</th>
+ <th style="text-align: right; background-color: #eeeeee;">&nbsp;&nbsp;N</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample p(r)</th>
{% else %}
- <th>Sample rho</th>
- <th>N Cases</th>
- <th>Sample p(rho)</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample rho</th>
+ <th style="text-align: right; background-color: #eeeeee;">&nbsp;&nbsp;N</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample p(rho)</th>
{% endif %}
{% elif target_dataset.type == "Geno" %}
{% if corr_method == 'pearson' %}
- <th>Sample r</th>
- <th>N Cases</th>
- <th>Sample p(r)</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample r</th>
+ <th style="text-align: right; background-color: #eeeeee;">N</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample p(r)</th>
{% else %}
- <th>Sample rho</th>
- <th>N Cases</th>
- <th>Sample p(rho)</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample rho</th>
+ <th style="text-align: right; background-color: #eeeeee;">N</th>
+ <th style="text-align: right; background-color: #eeeeee;">Sample p(rho)</th>
{% endif %}
{% endif %}
</tr>
@@ -91,58 +99,56 @@
<tbody>
{% for trait in correlation_results %}
<tr>
- <TD><INPUT TYPE="checkbox" NAME="searchResult" class="checkbox trait_checkbox" style="transform: scale(1.5);" VALUE="{{ data_hmac('{}:{}'.format(trait.name, trait.dataset.name)) }}">
- </TD>
- <TD align="right">{{ loop.index }}</TD>
- <TD>
+ <td>&nbsp;<INPUT TYPE="checkbox" NAME="searchResult" class="checkbox trait_checkbox" style="transform: scale(1.5);" VALUE="{{ data_hmac('{}:{}'.format(trait.name, trait.dataset.name)) }}"></td>
+ <td align="right">{{ loop.index }}</td>
+ <td>
<a href="{{ url_for('show_trait_page',
trait_id = trait.name,
dataset = dataset.name
)}}">
{{ trait.name }}
</a>
- </TD>
+ </td>
{% if target_dataset.type == 'ProbeSet' %}
- <TD>{{ trait.symbol }}</TD>
- <TD>{{ trait.description_display }}</TD>
- <TD style="white-space: nowrap;">{{ trait.location_repr }}</TD>
- <TD align="right">{{ '%0.3f' % trait.mean|float }}</TD>
- <TD align="right">{{ '%0.3f' % trait.LRS_score_repr|float }}</TD>
- <TD style="white-space: nowrap;">{{ trait.LRS_location_repr }}</TD>
- <TD align="right">{{ '%0.3f' % trait.additive|float }}</TD>
- <TD><a target="_blank" href="corr_scatter_plot?dataset_1={{dataset.name}}&dataset_2={{trait.dataset.name}}&trait_1={{this_trait.name}}&trait_2={{trait.name}}">{{'%0.3f'|format(trait.sample_r)}}</a></TD>
- <TD>{{ trait.num_overlap }}</TD>
- <TD>{{'%0.3e'|format(trait.sample_p)}}</TD>
+ <td>{{ trait.symbol }}</td>
+ <td>{{ trait.description_display }}</TD>
+ <td align="right"style="white-space: nowrap;">{{ trait.location_repr }}</td>
+ <td align="right">{{ '%0.3f' % trait.mean|float }}</td>
+ <td align="right" style="padding-right: 15px;">{% if trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % trait.LRS_score_repr|float }}{% else %}N/A{% endif %}</td>
+ <td align="right" style="padding-right: 15px;">{{ trait.LRS_location_repr }}</td>
+ <td align="right" style="padding-right: 15px;">{% if trait.additive != "" %}{{ '%0.3f' % trait.additive|float }}{% else %}N/A{% endif %}</td>
+ <td align="right" style="padding-right: 15px;"><a target="_blank" href="corr_scatter_plot?dataset_1={{dataset.name}}&dataset_2={{trait.dataset.name}}&trait_1={{this_trait.name}}&trait_2={{trait.name}}">{{'%0.3f'|format(trait.sample_r)}}</a></td>
+ <td align="right" style="padding-right: 15px;">{{ trait.num_overlap }}</td>
+ <td align="right" style="padding-right: 15px;">{{'%0.3e'|format(trait.sample_p)}}</td>
{% if trait.lit_corr == "" or trait.lit_corr == 0.000 %}
- <TD>--</TD>
+ <td align="right" style="padding-right: 15px;">--</td>
{% else %}
- <TD>{{'%0.3f'|format(trait.lit_corr)}}</TD>
+ <td align="right" style="padding-right: 15px;">{{'%0.3f'|format(trait.lit_corr)}}</td>
{% endif %}
{% if trait.tissue_corr == "" or trait.tissue_corr == 0.000 %}
- <TD>--</TD>
+ <td align="right" style="padding-right: 15px;">--</td>
{% else %}
- <TD>{{'%0.3f'|format(trait.tissue_corr)}}</TD>
+ <td align="right" style="padding-right: 15px;">{{'%0.3f'|format(trait.tissue_corr)}}</td>
{% endif %}
- <TD>{{'%0.3e'|format(trait.tissue_pvalue)}}</TD>
{% elif target_dataset.type == "Publish" %}
- <TD>{{ trait.description_display }}</TD>
- <TD>{{ trait.authors }}</TD>
- <TD>
+ <td>{{ trait.description_display }}</td>
+ <td>{{ trait.authors }}</td>
+ <td>
<a href="{{ trait.pubmed_link }}">
{{ trait.pubmed_text }}
</a>
- </TD>
- <TD>{{ trait.LRS_score_repr }}</TD>
- <TD>{{ trait.LRS_location_repr }}</TD>
- <TD>{{ '%0.3f' % trait.additive|float }}</TD>
- <TD><a target="_blank" href="corr_scatter_plot?dataset_1={{dataset.name}}&dataset_2={{trait.dataset.name}}&trait_1={{this_trait.name}}&trait_2={{trait.name}}">{{'%0.3f'|format(trait.sample_r)}}</a></TD>
- <TD>{{ trait.num_overlap }}</TD>
- <TD>{{'%0.3e'|format(trait.sample_p)}}</TD>
+ </td>
+ <td align="right" style="padding-right: 15px;">{{ trait.LRS_score_repr }}</td>
+ <td align="right" style="padding-right: 15px;">{{ trait.LRS_location_repr }}</td>
+ <td align="right" style="padding-right: 15px;">{% if trait.additive != "" %}{{ '%0.3f' % trait.additive|float }}{% else %}N/A{% endif %}</td>
+ <td align="right" style="padding-right: 15px;"><a target="_blank" href="corr_scatter_plot?dataset_1={{dataset.name}}&dataset_2={{trait.dataset.name}}&trait_1={{this_trait.name}}&trait_2={{trait.name}}">{{'%0.3f'|format(trait.sample_r)}}</a></td>
+ <td align="right" style="padding-right: 15px;">{{ trait.num_overlap }}</td>
+ <td align="right" style="padding-right: 15px;">{{'%0.3e'|format(trait.sample_p)}}</td>
{% elif target_dataset.type == "Geno" %}
- <TD>{{ trait.location_repr }}</TD>
- <TD><a target="_blank" href="corr_scatter_plot?dataset_1={{dataset.name}}&dataset_2={{trait.dataset.name}}&trait_1={{this_trait.name}}&trait_2={{trait.name}}">{{'%0.3f'|format(trait.sample_r)}}</a></TD>
- <TD>{{ trait.num_overlap }}</TD>
- <TD>{{'%0.3e'|format(trait.sample_p)}}</TD>
+ <td align="right" style="padding-right: 15px;">{{ trait.location_repr }}</TD>
+ <td align="right" style="padding-right: 15px;"><a target="_blank" href="corr_scatter_plot?dataset_1={{dataset.name}}&dataset_2={{trait.dataset.name}}&trait_1={{this_trait.name}}&trait_2={{trait.name}}">{{'%0.3f'|format(trait.sample_r)}}</a></td>
+ <td align="right" style="padding-right: 15px;">{{ trait.num_overlap }}</td>
+ <td align="right" style="padding-right: 15px;">{{'%0.3e'|format(trait.sample_p)}}</td>
{% endif %}
</tr>
{% endfor %}
@@ -161,12 +167,8 @@
<script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.naturalSort.js"></script>
- <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colResize.js"></script>
- <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colReorder.js"></script>
<script language="javascript" type="text/javascript" src="/static/packages/DT_bootstrap/DT_bootstrap.js"></script>
<script language="javascript" type="text/javascript" src="/static/packages/TableTools/media/js/TableTools.min.js"></script>
- <script language="javascript" type="text/javascript" src="//cdn.datatables.net/fixedheader/2.1.2/js/dataTables.fixedHeader.min.js"></script>
- <script language="javascript" type="text/javascript" src="//cdn.datatables.net/fixedcolumns/3.0.4/js/dataTables.fixedColumns.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/packages/underscore/underscore-min.js"></script>
<script type="text/javascript" charset="utf-8">
function getValue(x) {
@@ -229,15 +231,28 @@
console.time("Creating table");
{% if target_dataset.type == "ProbeSet" %}
-
-
$('#trait_table').dataTable( {
+ "paging": false,
+ "buttons": [
+ {
+ extend: 'csvHtml5',
+ text: 'Download CSV',
+ title: 'correlation_results',
+ fieldBoundary: '"',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
+ }
+ }
+ ],
+ "columnDefs": [
+ { "targets": 0, "orderable": false }
+ ],
"columns": [
{ "type": "natural" },
{ "type": "natural" },
{ "type": "natural" },
{ "type": "natural" },
- { "type": "natural" },
+ { "type": "natural", "width": "20%" },
{ "type": "natural" },
{ "type": "natural" },
{ "type": "natural" },
@@ -247,19 +262,14 @@
{ "type": "natural" },
{ "type": "natural" },
{ "type": "natural" },
- { "type": "natural" },
{ "type": "natural" }
],
- "buttons": [
- 'csvHtml5'
- ],
- "sDom": "RZBtir",
- "iDisplayLength": -1,
+ "order": [[10, "desc" ]],
+ "sDom": "Btir",
+ "autoWidth": false,
"bDeferRender": true,
- "bSortClasses": false,
- //"scrollY": "700px",
- //"scrollCollapse": false,
- "paging": false
+ "scrollY": "800px",
+ "scrollCollapse": false
} );
var table = $('#trait_table').DataTable();
@@ -267,12 +277,27 @@
{% elif target_dataset.type == "Publish" %}
$('#trait_table').dataTable( {
+ "paging": false,
+ "buttons": [
+ {
+ extend: 'csvHtml5',
+ text: 'Download CSV',
+ title: 'correlation_results',
+ fieldBoundary: '"',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
+ }
+ }
+ ],
+ "columnDefs": [
+ { "targets": 0, "orderable": false }
+ ],
"columns": [
{ "type": "natural" },
{ "type": "natural" },
{ "type": "natural" },
- { "type": "natural" },
- { "type": "natural" },
+ { "type": "natural", "width": "25%" },
+ { "type": "natural", "width": "10%" },
{ "type": "natural" },
{ "type": "natural" },
{ "type": "natural" },
@@ -281,24 +306,30 @@
{ "type": "natural" },
{ "type": "natural" }
],
- "buttons": [
- 'csvHtml5'
- ],
- "sDom": "RZBtir",
- "iDisplayLength": -1,
- "autoWidth": true,
- "bLengthChange": true,
+ "order": [[9, "desc" ]],
+ "sDom": "Btir",
+ "autoWidth": false,
"bDeferRender": true,
- "bSortClasses": false,
- "scrollY": "700px",
- "scrollCollapse": false,
- "colResize": {
- "tableWidthFixed": false
- },
- "paging": false
+ "scrollY": "800px",
+ "scrollCollapse": false
} );
{% elif target_dataset.type == "Geno" %}
$('#trait_table').dataTable( {
+ "paging": false,
+ "buttons": [
+ {
+ extend: 'csvHtml5',
+ text: 'Download CSV',
+ title: 'correlation_results',
+ fieldBoundary: '"',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5, 6]
+ }
+ }
+ ],
+ "columnDefs": [
+ { "targets": 0, "orderable": false }
+ ],
"columns": [
{ "type": "natural" },
{ "type": "natural" },
@@ -308,21 +339,12 @@
{ "type": "natural" },
{ "type": "natural" }
],
- "buttons": [
- 'csvHtml5'
- ],
- "sDom": "RZBtir",
- "iDisplayLength": -1,
- "autoWidth": true,
- "bLengthChange": true,
+ "order": [[4, "desc" ]],
+ "sDom": "Btir",
+ "autoWidth": false,
"bDeferRender": true,
- "bSortClasses": false,
- "scrollY": "700px",
- "scrollCollapse": false,
- "colResize": {
- "tableWidthFixed": false
- },
- "paging": false
+ "scrollY": "800px",
+ "scrollCollapse": false
} );
{% endif %}
console.timeEnd("Creating table");
diff --git a/wqflask/wqflask/templates/ctl_results.html b/wqflask/wqflask/templates/ctl_results.html
new file mode 100644
index 00000000..a5cb1c08
--- /dev/null
+++ b/wqflask/wqflask/templates/ctl_results.html
@@ -0,0 +1,47 @@
+{% extends "base.html" %}
+{% block title %}CTL results{% endblock %}
+
+{% block content %} <!-- Start of body -->
+<div class="container">
+ <h1>CTL Results</h1>
+ {{(request.form['trait_list'].split(',')|length -1)}} phenotypes as input<br>
+ <h3>Network Figure</h3>
+ <a href="/tmp/{{ results['imgurl1'] }}">
+ <img alt="Embedded Image" src="data:image/png;base64,
+ {% for elem in results['imgdata1'] -%}
+ {% print("%c"|format(elem)) %}
+ {%- endfor %}
+ " /></a>
+ <h3>CTL/QTL Plots for individual traits</h3>
+ {% for r in range(2, (request.form['trait_list'].split(',')|length +1)) %}
+ <a href="/tmp/{{ results['imgurl' + r|string] }}">
+ <img width=100 height=100 alt="Embedded Image" src="data:image/png;base64,
+ {% for elem in results['imgdata' + r|string] -%}
+ {% print("%c"|format(elem)) %}
+ {%- endfor %}
+ " /></a>
+ {% endfor %}
+ <h3>Tabular results</h3>
+ <table width="80%">
+ <tr><th>trait</th><th>marker</th><th>trait</th><th>LOD</th><th>dCor</th></tr>
+ significant CTL:<br>
+ {% for r in range(results['ctlresult'][0]|length) %}
+ <tr>
+ {% for c in range(results['ctlresult']|length) %}
+ <td>
+ {% if c > 2 %}
+ {{results['ctlresult'][c][r]|float|round(2)}}
+ {% else %}
+ {{results['ctlresult'][c][r]}}
+ {% endif %}
+ </td>
+ {% endfor %}
+ </tr>
+ {% endfor %}
+ </table>
+
+
+
+
+</div>
+{% endblock %}
diff --git a/wqflask/wqflask/templates/ctl_setup.html b/wqflask/wqflask/templates/ctl_setup.html
new file mode 100644
index 00000000..9c0d7bea
--- /dev/null
+++ b/wqflask/wqflask/templates/ctl_setup.html
@@ -0,0 +1,65 @@
+{% extends "base.html" %}
+{% block title %}WCGNA analysis{% endblock %}
+
+{% block content %} <!-- Start of body -->
+<div class="container">
+ <h1>CTL analysis parameters</h1>
+ {{(request.form['trait_list'].split(',')|length -1)}} phenotypes as input
+
+<form action="/ctl_results" method="post" class="form-horizontal">
+ <input type="hidden" name="trait_list" id="trait_list" value= "{{request.form['trait_list']}}">
+
+ <div class="dropdown">
+ <label for="Strategy">Strategy</label>
+ <div class="col-sm-10">
+ <select name="strategy" id="strategy">
+ <option value="Exact">Exact</option>
+ <option value="Full">Full</option>
+ <option value="Pairwise">Pairwise</option>
+ </select>
+ </div>
+ </div>
+
+ <div class="dropdown">
+ <label for="Permutations">Number of permutation (Used when strategy is Full or Pairwise)</label>
+ <div class="col-sm-10">
+ <select name="nperm" id="nperm">
+ <option value="100">100</option>
+ <option value="1000" selected="selected">1000</option>
+ <option value="10000">10000</option>
+ </select>
+ </div>
+ </div>
+
+ <div class="dropdown">
+ <label for="Coefficient">Type of correlation coefficient</label>
+ <div class="col-sm-10">
+ <select name="parametric" id="parametric">
+ <option value="False">Spearman</option>
+ <option value="True">Pearson</option>
+ </select>
+ </div>
+ </div>
+
+
+ <div class="dropdown">
+ <label for="Significance">Significance level</label>
+ <div class="col-sm-10">
+ <select name="significance" id="significance">
+ <option value="0.1">0.1</option>
+ <option value="0.05" selected="selected">0.05</option>
+ <option value="0.001">0.001</option>
+ </select>
+ </div>
+ </div>
+ <br>
+ <div class="form-group">
+ <div class="col-sm-10">
+ <input type="submit" class="btn btn-primary" value="Run CTL using these settings" />
+ </div>
+ </div>
+
+</form>
+
+</div>
+{% endblock %}
diff --git a/wqflask/wqflask/templates/gsearch_gene.html b/wqflask/wqflask/templates/gsearch_gene.html
index 0a1839a1..70cafcfe 100755
--- a/wqflask/wqflask/templates/gsearch_gene.html
+++ b/wqflask/wqflask/templates/gsearch_gene.html
@@ -2,16 +2,14 @@
{% block title %}Search Results{% endblock %}
{% block css %}
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
- <link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" />
- <link rel="stylesheet" type="text/css" href="/static/packages/TableTools/media/css/TableTools.css" />
- <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/dataTables.fixedHeader.css" >
- <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/fixedcolumns/3.0.4/css/dataTables.fixedColumns.css">
+ <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" />
{% endblock %}
{% block content %}
<!-- Start of body -->
<div class="container">
+ <p>You searched for {{ terms }}.</p>
<p>To study a record, click on its ID below.<br />Check records below and click Add button to add to selection.</p>
<div>
@@ -20,52 +18,71 @@
<button class="btn btn-default" id="deselect_all"><span class="glyphicon glyphicon-remove"></span> Deselect All</button>
<button class="btn btn-default" id="invert"><span class="glyphicon glyphicon-resize-vertical"></span> Invert</button>
<button class="btn btn-default" id="add" disabled ><span class="glyphicon glyphicon-plus-sign"></span> Add</button>
- <button class="btn btn-primary pull-right"><span class="glyphicon glyphicon-download"></span> Download Table</button>
<input type="text" id="searchbox" class="form-control" style="width: 180px; display: inline;" placeholder="Search This Table For ...">
<input type="text" id="select_top" class="form-control" style="width: 120px; display: inline;" placeholder="Select Top ...">
<br />
<br />
- <table width="2000px" class="table table-hover table-striped" id="trait_table">
+ <div style="width: 2000px; background-color: #eeeeee; border: 1px solid black;">
+ <table width="2000px" id="trait_table" class="table table-hover table-striped" >
<thead>
- <tr>
- <th style="width: 30px;"></th>
- <th>Index</th>
- <th>Species</th>
- <th>Group</th>
- <th>Tissue</th>
- <th>Dataset</th>
- <th>Record</th>
- <th>Symbol</th>
- <th>Description</th>
- <th>Location</th>
- <th>Mean</th>
- <th style="text-align: right;">Max&nbsp;&nbsp;<br>LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
- <th>Max LRS Location</th>
- <th style="text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
- </tr>
- </thead>
+ <tr>
+ <th style="background-color: #eeeeee;"></th>
+ <th style="background-color: #eeeeee;">Index</th>
+ <th style="background-color: #eeeeee;">Species</th>
+ <th style="background-color: #eeeeee;">Group</th>
+ <th style="background-color: #eeeeee;">Tissue</th>
+ <th style="background-color: #eeeeee;">Dataset</th>
+ <th style="background-color: #eeeeee;">Record</th>
+ <th style="background-color: #eeeeee;">Symbol</th>
+ <th style="background-color: #eeeeee;">Description</th>
+ <th style="background-color: #eeeeee;">Location</th>
+ <th style="background-color: #eeeeee;">Mean</th>
+ <th style="background-color: #eeeeee;">Max&nbsp;&nbsp;<br>LRS<a href="http://genenetwork.org/glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ <th style="background-color: #eeeeee;">Max LRS Location</th>
+ <th style="background-color: #eeeeee;">Additive<br>Effect<a href="http://genenetwork.org/glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ </tr>
+ </thead>
<tbody>
- {% for this_trait in trait_list %}
- <TR id="trait:{{ this_trait.name }}:{{ this_trait.dataset.name }}">
- <TD><INPUT TYPE="checkbox" NAME="searchResult" class="checkbox trait_checkbox" style="transform: scale(1.5);" VALUE="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) }}"></TD>
- <TD>{{ loop.index }}</TD>
- <TD>{{ this_trait.dataset.group.species }}</TD>
- <TD>{{ this_trait.dataset.group.name }}</TD>
- <TD>{{ this_trait.dataset.tissue }}</TD>
- <TD>{{ this_trait.dataset.fullname }}</TD>
- <TD><a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset.name)}}">{{ this_trait.name }}</a></TD>
- <TD>{{ this_trait.symbol }}</TD>
- <TD>{{ this_trait.description_display }}</TD>
- <TD>{{ this_trait.location_repr }}</TD>
- <TD align="right">{{ '%0.3f' % this_trait.mean|float }}</TD>
- <TD align="right">{{ '%0.3f' % this_trait.LRS_score_repr|float }}</TD>
- <TD>{{ this_trait.LRS_location_repr }}</TD>
- <TD align="right">{{ '%0.3f' % this_trait.additive|float }}</TD>
- </TR>
- {% endfor %}
+ {% for this_trait in trait_list %}
+ <tr id="trait:{{ this_trait.name }}:{{ this_trait.dataset.name }}">
+ <td><input type="checkbox" name="searchResult" class="checkbox trait_checkbox" style="transform: scale(1.5);" value="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) }}"></td>
+ <td>{{ loop.index }}</td>
+ <td>{{ this_trait.dataset.group.species }}</td>
+ <td>{{ this_trait.dataset.group.name }}</td>
+ <td>{{ this_trait.dataset.tissue }}</td>
+ <td>{{ this_trait.dataset.name }}</td>
+ <td><a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset.name)}}">{{ this_trait.name }}</a></td>
+ <td>{{ this_trait.symbol }}</td>
+ <td>{{ this_trait.description_display }}</td>
+ <td align="right">{{ this_trait.location_repr }}</td>
+ <td align="right">{{ '%0.3f' % this_trait.mean|float }}</td>
+ <td align="right">{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}</td>
+ <td align="right">{{ this_trait.LRS_location_repr }}</td>
+ <td align="right">{% if this_trait.additive != "" %}{{ '%0.3f' % this_trait.additive|float }}{% else %}N/A{% endif %}</td>
+ </tr>
+ {% endfor %}
</tbody>
- </table>
+ <tfoot>
+ <tr>
+ <th style="background-color: #eeeeee;"></th>
+ <th style="background-color: #eeeeee;">Index</th>
+ <th style="background-color: #eeeeee;">Species</th>
+ <th style="background-color: #eeeeee;">Group</th>
+ <th style="background-color: #eeeeee;">Tissue</th>
+ <th style="background-color: #eeeeee;">Dataset</th>
+ <th style="background-color: #eeeeee;">Record</th>
+ <th style="background-color: #eeeeee;">Symbol</th>
+ <th style="background-color: #eeeeee;">Description</th>
+ <th style="background-color: #eeeeee;">Location</th>
+ <th style="background-color: #eeeeee;">Mean</th>
+ <th style="background-color: #eeeeee;">Max&nbsp;&nbsp;<br>LRS<a href="http://genenetwork.org/glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ <th style="background-color: #eeeeee;">Max LRS Location</th>
+ <th style="background-color: #eeeeee;">Additive<br>Effect<a href="http://genenetwork.org/glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ </tr>
+ </tfoot>
+ </table>
+ </div>
</div>
</div>
@@ -77,6 +94,10 @@
<script language="javascript" type="text/javascript" src="/static/new/javascript/search_results.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.html5.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.naturalSort.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colReorder.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colResize.js"></script>
@@ -98,42 +119,6 @@
}
return parseFloat(x);
}
-
- jQuery.fn.dataTableExt.oSort['cust-txt-asc'] = function (a, b) {
- var x = getValue(a);
- var y = getValue(b);
-
- if (x == 'N/A' || x == '') {
- return 1;
- }
- else if (y == 'N/A' || y == '') {
- return -1;
- }
- else {
- return ((x < y) ? -1 : ((x > y) ? 1 : 0));
- }
- };
-
- jQuery.fn.dataTableExt.oSort['cust-txt-asc'] = function (a, b) {
- var x = getValue(a);
- var y = getValue(b);
-
- if (x == 'N/A' || x == '') {
- return 1;
- }
- else if (y == 'N/A' || y == '') {
- return -1;
- }
- else {
- return ((x < y) ? -1 : ((x > y) ? 1 : 0));
- }
- };
-
- jQuery.fn.dataTableExt.oSort['cust-txt-desc'] = function (a, b) {
- var x = getValue(a);
- var y = getValue(b);
- return ((x < y) ? 1 : ((x > y) ? -1 : 0));
- };
$.fn.dataTable.ext.order['dom-checkbox'] = function ( settings, col )
{
@@ -152,32 +137,40 @@
console.time("Creating table");
$('#trait_table').DataTable( {
+ "paging": false,
+ "buttons": [
+ {
+ extend: 'csvHtml5',
+ text: 'Download CSV',
+ title: 'search_results',
+ fieldBoundary: '"',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
+ }
+ }
+ ],
"columns": [
{ "type": "natural" },
{ "type": "natural" },
{ "type": "natural" },
- { "type": "cust-txt" },
- { "type": "natural" },
+ { "type": "natural", "width": "8%" },
{ "type": "natural" },
{ "type": "natural" },
{ "type": "natural" },
- { "type": "natural", "width": "15%" },
{ "type": "natural" },
{ "type": "natural" },
+ { "type": "natural", "width": "8%" },
{ "type": "natural" },
- { "type": "natural" },
- { "type": "cust-txt" }
+ { "type": "natural", "width": "5%" },
+ { "type": "natural", "width": "8%" },
+ { "type": "natural" }
],
- "order": [[ 1, "asc" ]],
- "sDom": "RZtir",
+ "order": [[1, "asc" ]],
+ "sDom": "Btir",
"autoWidth": false,
- "bLengthChange": true,
"bDeferRender": true,
- "scrollCollapse": false,
- "colResize": {
- "tableWidthFixed": false,
- },
- "paging": false
+ "scrollY": "800px",
+ "scrollCollapse": false
} );
console.timeEnd("Creating table");
diff --git a/wqflask/wqflask/templates/gsearch_pheno.html b/wqflask/wqflask/templates/gsearch_pheno.html
index 2527bebf..9be0349f 100755
--- a/wqflask/wqflask/templates/gsearch_pheno.html
+++ b/wqflask/wqflask/templates/gsearch_pheno.html
@@ -4,6 +4,7 @@
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
<link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" />
<link rel="stylesheet" type="text/css" href="/static/packages/TableTools/media/css/TableTools.css" />
+ <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" />
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/dataTables.fixedHeader.css" >
<link rel="stylesheet" type="text/css" href="//cdn.datatables.net/fixedcolumns/3.0.4/css/dataTables.fixedColumns.css">
{% endblock %}
@@ -20,45 +21,61 @@
<button class="btn btn-default" id="deselect_all"><span class="glyphicon glyphicon-remove"></span> Deselect All</button>
<button class="btn btn-default" id="invert"><span class="glyphicon glyphicon-resize-vertical"></span> Invert</button>
<button class="btn btn-default" id="add" disabled ><span class="glyphicon glyphicon-plus-sign"></span> Add</button>
- <button class="btn btn-primary pull-right"><span class="glyphicon glyphicon-download"></span> Download Table</button>
<input type="text" id="searchbox" class="form-control" style="width: 200px; display: inline;" placeholder="Search This Table For ...">
<input type="text" id="select_top" class="form-control" style="width: 200px; display: inline;" placeholder="Select Top ...">
<br />
<br />
- <table class="table table-hover table-striped" id='trait_table' style="float: left;">
+ <div style="width: 1500px; background-color: #eeeeee; border: 1px solid black;">
+ <table width="1500px" id="trait_table" class="table table-hover table-striped">
<thead>
<tr>
- <th style="width: 30px;"></th>
- <th>Index</th>
- <th>Species</th>
- <th>Group</th>
- <th>Record</th>
- <th>Description</th>
- <th>Authors</th>
- <th>Year</th>
- <th style="text-align: right;">Max&nbsp;&nbsp;<br>LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
- <th>Max LRS Location</th>
- <th style="text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ <th style="background-color: #eeeeee;"></th>
+ <th style="background-color: #eeeeee;">Index</th>
+ <th style="background-color: #eeeeee;">Species</th>
+ <th style="background-color: #eeeeee;">Group</th>
+ <th style="background-color: #eeeeee;">Record</th>
+ <th style="background-color: #eeeeee;">Description</th>
+ <th style="background-color: #eeeeee;">Authors</th>
+ <th style="background-color: #eeeeee;">Year</th>
+ <th style="background-color: #eeeeee; text-align: right;">Max&nbsp;&nbsp;<br>LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ <th style="background-color: #eeeeee;">Max LRS Location</th>
+ <th style="background-color: #eeeeee; text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
</tr>
</thead>
<tbody>
{% for this_trait in trait_list %}
<TR id="trait:{{ this_trait.name }}:{{ this_trait.dataset.name }}">
- <TD><INPUT TYPE="checkbox" NAME="searchResult" class="checkbox trait_checkbox" style="transform: scale(1.5);" VALUE="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) }}"></TD>
- <TD>{{ loop.index }}</TD>
- <TD>{{ this_trait.dataset.group.species }}</TD>
- <TD>{{ this_trait.dataset.group.name }}</TD>
- <TD><a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset.name)}}">{{ this_trait.name }}</a></TD>
- <TD>{{ this_trait.description_display }}</TD>
- <TD>{{ this_trait.authors }}</TD>
- <TD><a href="{{ this_trait.pubmed_link }}">{{ this_trait.pubmed_text }}</a></TD>
- <TD>{{ this_trait.LRS_score_repr }}</TD>
- <TD>{{ this_trait.LRS_location_repr }}</TD>
- <TD>{{ '%0.3f' % this_trait.additive|float }}</TD>
+ <td><INPUT TYPE="checkbox" NAME="searchResult" class="checkbox trait_checkbox" style="transform: scale(1.5);" VALUE="{{ data_hmac('{}:{}'.format(this_trait.name, this_trait.dataset.name)) }}"></td>
+ <td>{{ loop.index }}</td>
+ <td>{{ this_trait.dataset.group.species }}</td>
+ <td>{{ this_trait.dataset.group.name }}</td>
+ <td><a href="{{ url_for('show_trait_page', trait_id = this_trait.name, dataset = this_trait.dataset.name)}}">{{ this_trait.name }}</a></td>
+ <td>{{ this_trait.description_display }}</td>
+ <td>{{ this_trait.authors }}</td>
+ <td><a href="{{ this_trait.pubmed_link }}">{{ this_trait.pubmed_text }}</a></td>
+ <td align="right">{% if this_trait.LRS_score_repr != "N/A" %}{{ '%0.1f' % this_trait.LRS_score_repr|float }}{% else %}N/A{% endif %}</td>
+ <td align="right">{{ this_trait.LRS_location_repr }}</td>
+ <td align="right">{% if this_trait.additive != "" %}{{ this_trait.additive }}{% else %}N/A{% endif %}</td>
</TR>
{% endfor %}
</tbody>
+ <tfoot>
+ <tr>
+ <th style="background-color: #eeeeee;"></th>
+ <th style="background-color: #eeeeee;">Index</th>
+ <th style="background-color: #eeeeee;">Species</th>
+ <th style="background-color: #eeeeee;">Group</th>
+ <th style="background-color: #eeeeee;">Record</th>
+ <th style="background-color: #eeeeee;">Description</th>
+ <th style="background-color: #eeeeee;">Authors</th>
+ <th style="background-color: #eeeeee;">Year</th>
+ <th style="background-color: #eeeeee; text-align: right;">Max&nbsp;&nbsp;<br>LRS<a href="http://genenetwork.org//glossary.html#L" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ <th style="background-color: #eeeeee;">Max LRS Location</th>
+ <th style="background-color: #eeeeee; text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ </tr>
+ </tfoot>
</table>
+ </div>
</div>
</div>
@@ -70,6 +87,10 @@
<script language="javascript" type="text/javascript" src="/static/new/javascript/search_results.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.html5.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.naturalSort.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colReorder.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colResize.js"></script>
@@ -123,29 +144,37 @@
console.time("Creating table");
$('#trait_table').DataTable( {
+ "paging": false,
+ "buttons": [
+ {
+ extend: 'csvHtml5',
+ text: 'Download CSV',
+ title: 'search_results',
+ fieldBoundary: '"',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+ }
+ }
+ ],
"columns": [
- { "bSortClasses": false },
- { "type": "natural" },
- { "type": "natural" },
{ "type": "natural" },
{ "type": "natural" },
- { "type": "natural", "width": "20%"},
{ "type": "natural" },
{ "type": "natural" },
{ "type": "natural" },
+ { "type": "natural", "width": "30%"},
+ { "type": "natural", "width": "25%"},
{ "type": "natural" },
+ { "type": "natural", "width": "8%"},
+ { "type": "natural", "width": "12%"},
{ "type": "natural" }
],
- "order": [[ 1, "asc" ]],
- "sDom": "RZtir",
+ "order": [[1, "asc" ]],
+ "sDom": "Btir",
"autoWidth": false,
- "bLengthChange": true,
"bDeferRender": true,
- "scrollCollapse": false,
- "colResize": {
- "tableWidthFixed": false,
- },
- "paging": false
+ "scrollY": "800px",
+ "scrollCollapse": false
} );
console.timeEnd("Creating table");
});
diff --git a/wqflask/wqflask/templates/index_page.html b/wqflask/wqflask/templates/index_page.html
index 5d658bc7..9e029911 100755
--- a/wqflask/wqflask/templates/index_page.html
+++ b/wqflask/wqflask/templates/index_page.html
@@ -143,7 +143,7 @@
highly expressed genes (15 to 16 log2 units) AND with peak <a href="http://www.genenetwork.org/glossary.html#L" target="_blank">LRS</a>
linkage between 23 and 46.</li>
- <li><b>RIF=mitochondrial</b> searches RNA databases for <a href="http://www.ncbi.nlm.nih.gov/projects/GeneRIF/GeneRIFhelp.html" target="_blank">
+ <li><b>RIF=mitochondrial</b> searches RNA databases for <a href="https://en.wikipedia.org/wiki/GeneRIF" target="_blank">
GeneRIF</a> links.</li>
<li><b>WIKI=nicotine</b> searches <a href="http://www.genenetwork.org/webqtl/main.py?FormID=geneWiki" target="_blank">
@@ -207,12 +207,12 @@
<li><a href="http://galaxy.genenetwork.org/" target="_blank">Galaxy</a> at
UTHSC</li>
- <li>GeneNetwork at <a href="http://ec2.genenetwork.org/" target="_blank">Amazon
+ <li>GeneNetwork 1 at <a href="http://ec2.genenetwork.org/" target="_blank">Amazon
Cloud (EC2)</a></li>
- <li>GeneNetwork Source Code at <a href="http://sourceforge.net/projects/genenetwork/" target="_blank">SourceForge</a></li>
+ <li>GeneNetwork 1 Source Code at <a href="http://sourceforge.net/projects/genenetwork/" target="_blank">SourceForge</a></li>
- <li>GeneNetwork Source Code at <a href="https://github.com/genenetwork/genenetwork" target="_blank">GitHub</a></li>
+ <li>GeneNetwork 2 Source Code at <a href="https://github.com/genenetwork/genenetwork2" target="_blank">GitHub</a></li>
</ul>
<h3>GN1 Mirror and development sites</h3>
diff --git a/wqflask/wqflask/templates/marker_regression_gn1.html b/wqflask/wqflask/templates/marker_regression_gn1.html
index 9f7dd41f..978ea55f 100644
--- a/wqflask/wqflask/templates/marker_regression_gn1.html
+++ b/wqflask/wqflask/templates/marker_regression_gn1.html
@@ -3,88 +3,240 @@
{% block css %}
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
<link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" />
+
+ <link rel="stylesheet" type="text/css" href="/static/new/css/marker_regression.css" />
+ <link rel="stylesheet" type="text/css" href="/static/new/css/panelutil.css" />
{% endblock %}
{% from "base_macro.html" import header %}
{% block content %}
- {{ header("Whole Genome Mapping Results",
- '{}: {}'.format(this_trait.name, this_trait.description_fmt)) }}
-
<div class="container">
<form method="post" target="_blank" action="/marker_regression" name="marker_regression" id="marker_regression_form">
<input type="hidden" name="temp_uuid" value="{{ temp_uuid }}">
<input type="hidden" name="trait_id" value="{{ this_trait.name }}">
<input type="hidden" name="dataset" value="{{ dataset.name }}">
+ <input type="hidden" name="method" value="{{ mapping_method }}">
{% for sample in dataset.group.samplelist %}
<input type="hidden" name="value:{{ sample }}" value="{{ vals[loop.index - 1] }}">
{% endfor %}
<input type="hidden" name="maf">
- <input type="hidden" name="method" value="{{ mapping_method }}">
<input type="hidden" name="selected_chr" value="{{ selectedChr }}">
- <input type="hidden" name="manhattan_plot">
- <input type="hidden" name="num_perm">
+ <input type="hidden" name="manhattan_plot" value="{{ manhattan_plot }}">
+ <input type="hidden" name="num_perm" value="{{ nperm }}">
+ <input type="hidden" name="perm_results" value="">
+ <input type="hidden" name="num_bootstrap" value="{{ nboot }}">
<input type="hidden" name="do_control" value="{{ doControl }}">
<input type="hidden" name="control_marker" value="{{ controlLocus }}">
<input type="hidden" name="mapmethod_rqtl_geno" value="{{ mapmethod_rqtl_geno }}">
<input type="hidden" name="mapmodel_rqtl_geno" value="{{ mapmodel_rqtl_geno }}">
<input type="hidden" name="pair_scan" value="{{ pair_scan }}">
- <div id="chart_container">
- <div class="qtlcharts" id="topchart">
- {{ gifmap|safe }}
- <img src="/static/output/{{ filename }}.jpeg" usemap="#WebQTLImageMap">
+
+ <div class="container">
+ <div class="col-xs-5">
+ <h2>Map Viewer: Whole Genome</h2><br>
+ <b>Population:</b> {{ dataset.group.species|capitalize }} {{ dataset.group.name }}<br>
+ <b>Database:</b> {{ dataset.fullname }}<br>
+ {% if dataset.type == "ProbeSet" %}<b>Trait ID:</b>{% else %}<b>Record ID:</b>{% endif %} <a href="/show_trait?trait_id={{ this_trait.name }}&dataset={{ dataset.name }}">{{ this_trait.name }}</a><br>
+ {% if dataset.type == "ProbeSet" %}
+ <b>Gene Symbol:</b> <i>{{ this_trait.symbol }}</i><br>
+ <b>Location:</b> Chr {{ this_trait.chr }} @ {{ this_trait.mb }} Mb
+ {% endif %}
+ </div>
+ <div id="gn1_map_options" class="col-xs-5" style="outline: 3px double #AAAAAA; padding: 10px; margin: 10px;">
+ <div class="col-xs-8" style="padding: 0px;">
+ <table>
+ <tr>
+ <td><b>Chr:&nbsp;</b></td>
+ <td>
+ <select name="chromosomes" size="1">
+ {% for chr in ChrList %}
+ <option value="{{ chr[1] }}" {% if (chr[1] + 1) == selectedChr %}selected{% endif %}>{{ chr[0] }}</option>
+ {% endfor %}
+ </select>&nbsp;
+ <button type="button" class="btn btn-primary" style="padding-bottom: 2px; padding-top: 2px;" onclick="javascript:remap();">Remap</button>
+ </td>
+ </tr>
+ <tr>
+ <td><b>View:&nbsp;</b></td>
+ <td style="padding: 5px;">
+ <input type="text" name="startMb" size="10" value="{% if startMb != -1 %}{{ startMb }}{% endif %}"> to <input type="text" name="endMb" size="10" value="{% if endMb != -1 %}{{ endMb }}{% endif %}">
+ </td>
+ </tr>
+ <tr>
+ <td><b>Units:&nbsp;</b></td>
+ <td style="padding: 5px;">
+ <label class="radio-inline">
+ <input type="radio" name="LRSCheck" value="LRS" {% if LRS_LOD == "LRS" %}checked{% endif %}>LRS
+ </label>
+ <label class="radio-inline">
+ <input type="radio" name="LRSCheck" value="LOD" {% if LRS_LOD == "LOD" %}checked{% endif %}>LOD
+ </label>
+ <a href="http://genenetwork.org/glossary.html#LOD" target="_blank">
+ <sup style="color:#f00"> ?</sup>
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td style="padding: 5px;">
+ <input type="text" name="lrsMax" value="{{ '%0.1f' | format(lrsMax|float) }}" size="3"> <span style="font-size: 12px;">units on the y-axis (0 for default)</span>
+ </td>
+ </tr>
+ <tr>
+ <td><b>Width:&nbsp;</b></td>
+ <td>
+ <input type="text" name="graphWidth" value="{% if graphWidth is defined %}{{ graphWidth }}{% else %}1600{% endif %}" size="5"><span style="font-size: 12px;"> pixels (minimum=900)</span>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div class="col-xs-4" style="padding: 0px;">
+ {% if (mapping_method == "reaper" or mapping_method == "rqtl_geno") and nperm > 0 %}
+ <input type="checkbox" name="permCheck" class="checkbox" style="display: inline; margin-top: 0px;" {% if permChecked|upper == "ON" %}value="ON" checked{% endif %}> <span style="font-size: 12px;">Permutation Test
+ <a href="http://genenetwork.org/glossary.html#Permutation" target="_blank">
+ <sup style="color:#f00"> ?</sup>
+ </a>
+ <br>
+ {% endif %}
+ {% if mapping_method == "reaper" and nboot > 0 %}
+ <input type="checkbox" name="bootCheck" class="checkbox" style="display: inline; margin-top: 0px;" {% if bootChecked|upper == "ON" %}value="ON" checked{% endif %}> <span style="font-size: 12px;">Bootstrap Test
+ <a href="http://genenetwork.org/glossary.html#bootstrap" target="_blank">
+ <sup style="color:#f00"> ?</sup>
+ </a>
+ <br>
+ {% endif %}
+ {% if mapping_method == "reaper" %}
+ <input type="checkbox" name="additiveCheck" class="checkbox" style="display: inline; margin-top: 0px;" {% if additiveChecked|upper == "ON" %}value="ON" checked{% endif %}> <span style="font-size: 12px;">Allele Effects
+ <a href="http://genenetwork.org/glossary.html#additive" target="_blank">
+ <sup style="color:#f00"> ?</sup>
+ </a>
+ <br>
+ {% endif %}
+ <input type="checkbox" name="showSNP" class="checkbox" style="display: inline; margin-top: 0px;" {% if SNPChecked|upper == "ON" %}value="ON" checked{% endif %}> <span style="font-size: 12px;">SNP Track </span>
+ <a href="http://genenetwork.org/glossary.html#snpSeismograph" target="_blank">
+ <sup style="color:#f00"> ?</sup>
+ </a>
+ <span style="color:red;">*</span>
+ <br>
+ <input type="checkbox" name="showGenes" class="checkbox" style="display: inline; margin-top: 0px;" {% if geneChecked|upper == "ON" %}value="ON" checked{% endif %}> <span style="font-size: 12px;">Gene Track </span> <span style="color:red;">*</span><br>
+ {% if plotScale != "morgan" %}
+ <input type="checkbox" name="haplotypeAnalystCheck" class="checkbox" style="display: inline; margin-top: 0px;" {% if haplotypeAnalystChecked|upper == "ON" %}value="ON" checked{% endif %}> <span style="font-size: 12px;">Haplotype Analyst </span> <span style="color:red;">*</span><br>
+ {% endif %}
+ <input type="checkbox" name="viewLegend" class="checkbox" style="display: inline; margin-top: 0px;" {% if legendChecked|upper == "ON" %}value="ON" checked{% endif %}> <span style="font-size: 12px;">Legend </span>
+ </div>
+ <div class="col-xs-12" align="center" style="padding: 5px;">
+ <span style="color:red;">*</span> <span style="font-size: 12px;">only apply to single chromosome physical mapping</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="tabbable" style="margin: 10px;">
+ <ul class="nav nav-tabs">
+ <li id="gn1_map_tab">
+ <a href="#gn1_map" data-toggle="tab" aria-expanded="true">GN1 Map</a>
+ </li>
+ {% if mapping_method != "gemma" %}
+ <li id="vector_map_tab">
+ <a href="#vector_map" data-toggle="tab" {% if mapping_method != "gemma" %}aria-expanded="false"{% else %}aria-expanded="true"{% endif %}>Vector Map</a>
+ </li>
+ {% endif %}
+ </ul>
+ <div class="tab-content">
+ <div class="tab-pane active" id="gn1_map">
+ <div class="qtlcharts">
+ {{ gifmap|safe }}
+ <img src="/generated/{{ filename }}.jpeg" usemap="#WebQTLImageMap">
+ {% if additiveChecked|upper == "ON" %}
+ <br>
+ <span style="white-space: nowrap;">A positive additive coefficient (green line) indicates that {{ dataset.group.parlist[1] }} alleles increase trait values. In contrast, a negative additive coefficient (orange line) indicates that {{ dataset.group.parlist[0] }} alleles increase trait values.</span>
+ {% endif %}
+ {% if nperm > 0 and permChecked == "ON" %}
+ <br><br>
+ <img src="/generated/{{ perm_filename }}.gif">
+ <br><br>
+ Total of {{ nperm }} permutations&nbsp;&nbsp;<a href="javascript:export_perm_data();" target="_blank" >Download Permutation Results</a>
+ <br>
+ {% endif %}
+ </div>
+ </div>
+ {% if mapping_method != "gemma" %}
+ <div class="tab-pane {% if mapping_method == "gemma" %}active{% endif %}" id="vector_map">
+ <div id="chart_container">
+ <div class="qtlcharts" id="topchart"></div>
+ </div>
</div>
+ {% endif %}
+ </div>
</div>
+
</form>
<div style="width:48%;">
- <h2>
- Results
- </h2>
- <table id="qtl_results" class="table table-hover table-striped">
- <thead>
- <tr>
- <th></th>
- <th>Index</th>
- <th>{{ LRS_LOD }}</th>
- <th>Chr</th>
- {% if plotScale == "centimorgan" %}
- <th>cM</th>
- {% else %}
- <th>Mb</th>
- {% endif %}
- <th>Locus</th>
- </tr>
- </thead>
- <tbody>
- {% for marker in qtlresults %}
- {% if (LRS_LOD == "LOD" and marker.lod_score|float > cutoff|float) or
- (LRS_LOD == "LRS" and marker.lrs_value|float > cutoff|float) %}
- <tr>
- <td>
- <input type="checkbox" name="selectCheck"
- class="checkbox edit_sample_checkbox"
- value="{{ marker.name }}" checked="checked">
- </td>
- <Td align="right">{{ loop.index }}</Td>
- {% if LRS_LOD == "LOD" %}
- <td>{{ '%0.2f' | format(marker.lod_score|float) }}</td>
- {% else %}
- <td>{{ '%0.2f' | format(marker.lrs_value|float) }}</td>
- {% endif %}
- <td>{{marker.chr}}</td>
- <td>{{ '%0.6f' | format(marker.Mb|float) }}</td>
- <td>
- {{ marker.name }}
- <!--<a href="{{ url_for('show_trait_page',
- trait_id = marker.name,
- dataset = dataset.name
- )}}">
- {{ marker.name }}
- </a>-->
- </td>
- </tr>
- {% endif %}
- {% endfor %}
- </tbody>
- </table>
+ {% if selectedChr == -1 %}
+ <h2>Results</h2>
+ <table id="qtl_results" class="table table-hover table-striped">
+ <thead>
+ <tr>
+ <th></th>
+ <th>Index</th>
+ <th>{{ LRS_LOD }}</th>
+ <th>Chr</th>
+ {% if plotScale == "centimorgan" %}
+ <th>cM</th>
+ {% else %}
+ <th>Mb</th>
+ {% endif %}
+ <th>Locus</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for marker in trimmed_markers %}
+ <tr>
+ <td>
+ <input type="checkbox" name="selectCheck"
+ class="checkbox edit_sample_checkbox"
+ value="{{ marker.name }}" checked="checked">
+ </td>
+ <td align="right">{{ loop.index }}</td>
+ {% if LRS_LOD == "LOD" %}
+ {% if 'lod_score' in marker %}
+ <td>{{ '%0.2f' | format(marker.lod_score|float) }}</td>
+ {% else %}
+ <td>{{ '%0.2f' | format(marker.lrs_value|float / 4.16) }}</td>
+ {% endif %}
+ {% else %}
+ {% if 'lod_score' in marker %}
+ <td>{{ '%0.2f' | format(marker.lod_score|float * 4.16) }}</td>
+ {% else %}
+ <td>{{ '%0.2f' | format(marker.lrs_value|float) }}</td>
+ {% endif %}
+ {% endif %}
+ <td>{{marker.chr}}</td>
+ <td>{{ '%0.6f' | format(marker.Mb|float) }}</td>
+ <td>{{ marker.name }}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ {% elif selectedChr > -1 %}
+ <h2>Interval Analyst</h2>
+ <table id="interval_analyst" class="table table-hover table-striped">
+ <thead>
+ <tr>
+ {% for header in gene_table_header %}
+ <th>{{ header|safe }}</th>
+ {% endfor %}
+ </tr>
+ </thead>
+ <tbody>
+ {% for row in gene_table_body %}
+ <tr>
+ {% for n in range(row|length) %}
+ <td>{{ row[n]|safe }}</td>
+ {% endfor %}
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+ {% endif %}
</div>
</div>
@@ -94,8 +246,10 @@
{% block js %}
+ <script type="text/javascript" src="http://d3js.org/d3.v3.min.js"></script>
<script type="text/javascript" src="/static/new/js_external/underscore-min.js"></script>
<script type="text/javascript" src="/static/new/js_external/underscore.string.min.js"></script>
+ <script type="text/javascript" src="/static/new/js_external/d3-tip.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.js"></script>
<script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script>
@@ -110,6 +264,13 @@
js_data = {{ js_data | safe }}
</script>
+ {% if mapping_method != "gemma" %}
+ <script language="javascript" type="text/javascript" src="/static/new/javascript/panelutil.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/new/javascript/chr_lod_chart.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/new/javascript/lod_chart.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/new/javascript/create_lodchart.js"></script>
+ {% endif %}
+
<script type="text/javascript" charset="utf-8">
$(document).ready( function () {
console.time("Creating table");
@@ -122,6 +283,7 @@
{ "type": "natural" },
{ "type": "natural", "sWidth": "30%"}
],
+ "order": [[1, "asc"]],
"buttons": [
'csv'
],
@@ -134,17 +296,62 @@
"scrollCollapse": true,
"paging": false
} );
- console.timeEnd("Creating table");
+
+ $('#interval_analyst').dataTable( {
+ "columnDefs": [ {
+ "targets": 0,
+ "sortable": false
+ }],
+ "order": [[3, "asc"]],
+ "sDom": "RZtir",
+ "iDisplayLength": -1,
+ "autoWidth": true,
+ "bDeferRender": true,
+ "bSortClasses": false,
+ "paging": false
+ } );
+
+ $('#vector_map_tab').click(function(){
+ $('div#gn1_map_options').hide();
+ });
+
+ $('#gn1_map_tab').click(function(){
+ $('div#gn1_map_options').show();
+ });
});
chrView = function(this_chr, chr_mb_list) {
- $('input[name=selected_chr]').val(this_chr + 1)
+ $('input[name=selected_chr]').val(this_chr)
$('input[name=chr_mb_list]').val(chr_mb_list)
return $('#marker_regression_form').submit();
};
+ rangeView = function(this_chr, start_mb, end_mb) {
+ $('input[name=selected_chr]').val(this_chr)
+ $('input[name=startMb]').val(start_mb)
+ $('input[name=endMb]').val(end_mb)
+ //$('input[name=mb_range]').val(start_mb + "," + end_mb)
+
+ return $('#marker_regression_form').submit();
+ };
+
+ remap = function() {
+ $('input[name=selected_chr]').val($('select[name=chromosomes]').val());
+ return $('#marker_regression_form').submit();
+ };
+
+ export_perm_data = function() {
+ var num_perm, perm_data;
+ num_perm = js_data.num_perm
+ perm_data = js_data.perm_results
+ json_perm_data = JSON.stringify(perm_data);
+ $('input[name=perm_results]').val(json_perm_data);
+ $('#marker_regression_form').attr('action', '/export_perm_data');
+ return $('#marker_regression_form').submit();
+ };
+
</script>
{% endblock %}
diff --git a/wqflask/wqflask/templates/pair_scan_results.html b/wqflask/wqflask/templates/pair_scan_results.html
index ab4a36bb..1ccb2b27 100644
--- a/wqflask/wqflask/templates/pair_scan_results.html
+++ b/wqflask/wqflask/templates/pair_scan_results.html
@@ -44,7 +44,7 @@
</tr>
</thead>
<tbody>
- {% for marker in filtered_markers %}
+ {% for marker in trimmed_markers %}
<tr>
<td>{{loop.index}}</td>
<td>{{marker.name}}</td>
diff --git a/wqflask/wqflask/templates/search_result_page.html b/wqflask/wqflask/templates/search_result_page.html
index 02365b1d..02c97862 100755
--- a/wqflask/wqflask/templates/search_result_page.html
+++ b/wqflask/wqflask/templates/search_result_page.html
@@ -2,6 +2,7 @@
{% block title %}Search Results{% endblock %}
{% block css %}
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
+ <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/scroller/1.4.1/css/scroller.dataTables.min.css">
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/dataTables.fixedHeader.css" >
<link rel="stylesheet" type="text/css" href="//cdn.datatables.net/fixedcolumns/3.0.4/css/dataTables.fixedColumns.css">
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" />
@@ -20,44 +21,30 @@
to find all records
{% for word in search_terms %}
{% if word.key|lower == "rif" %}
- with <u>GeneRIF</u> containing <strong>{{ word.search_term[0] }}</strong>{% if not loop.last %} and {% endif %}
+ with <u>GeneRIF</u> containing <strong>{{ word.search_term[0] }}</strong>{% if loop.last %}.{% else %} and {% endif %}
{% elif word.key|lower == "go" %}
- with <u>Gene Ontology ID</u> <strong>{{ word.search_term[0] }}</strong>{% if not loop.last %} and {% endif %}
+ with <u>Gene Ontology ID</u> <strong>{{ word.search_term[0] }}</strong>{% if loop.last %}.{% else %} and {% endif %}
{% elif word.key|lower == "wiki" %}
- with <u>GeneWiki</u> containing <strong>{{ word.search_term[0] }}</strong>{% if not loop.last %} and {% endif %}
+ with <u>GeneWiki</u> containing <strong>{{ word.search_term[0] }}</strong>{% if loop.last %}.{% else %} and {% endif %}
{% elif word.key|lower == "mean" %}
- with <u>MEAN</u> between <strong>{{ word.search_term[0] }}</strong> and <strong>{{ word.search_term[1] }}</strong>{% if not loop.last %} and {% endif %}
+ with <u>MEAN</u> between <strong>{{ word.search_term[0] }}</strong> and <strong>{{ word.search_term[1] }}</strong>{% if loop.last %}.{% else %} and {% endif %}
{% elif word.key|lower == "lrs" or word.key|lower == "translrs" or word.key|lower == "cislrs" %}
{% if word.search_term|length == 1 %}
- with {% if word.key|lower == "translrs" %}trans{% elif word.key|lower == "cislrs" %}cis{% endif %}LRS {% if word.separator == ">" %} greater than {% elif word.separator == "<" %} less than {% elif word.separator == ">=" %} greater than or equal to {% elif word.separator == "<=" %} less than or equal to {% endif %} <strong>{{ word.search_term[0] }}</strong>{% if not loop.last %} and {% endif %}
+ with {% if word.key|lower == "translrs" %}trans{% elif word.key|lower == "cislrs" %}cis{% endif %}LRS {% if word.separator == ">" %} greater than {% elif word.separator == "<" %} less than {% elif word.separator == ">=" %} greater than or equal to {% elif word.separator == "<=" %} less than or equal to {% endif %} <strong>{{ word.search_term[0] }}</strong>{% if loop.last %}.{% else %} and {% endif %}
{% elif word.search_term|length == 2 %}
- with <u>LRS</u> between <strong>{{ word.search_term[0] }}</strong> and <strong>{{ word.search_term[1] }}</strong>{% if not loop.last %} and {% endif %}
+ with <u>LRS</u> between <strong>{{ word.search_term[0] }}</strong> and <strong>{{ word.search_term[1] }}</strong>{% if loop.last %}.{% else %} and {% endif %}
{% elif word.search_term|length == 3 %}
- with <u>LRS</u> between <strong>{{ word.search_term[0] }}</strong> and <strong>{{ word.search_term[1] }}</strong> on chromosome <strong>{{ word.search_term[2] }}</strong>{% if not loop.last %} and {% endif %}
+ with <u>LRS</u> between <strong>{{ word.search_term[0] }}</strong> and <strong>{{ word.search_term[1] }}</strong> on chromosome <strong>{{ word.search_term[2] }}</strong>{% if loop.last %}.{% else %} and {% endif %}
{% elif word.search_term|length == 5 %}
- with <u>LRS</u> between <strong>{{ word.search_term[0] }}</strong> and <strong>{{ word.search_term[1] }}</strong> on chromosome <strong>{{ word.search_term[2] }}</strong> between <strong>{{ word.search_term[3] }}</strong> and <strong>{{ word.search_term[4] }}</strong> Mb{% if not loop.last %} and {% endif %}
+ with <u>LRS</u> between <strong>{{ word.search_term[0] }}</strong> and <strong>{{ word.search_term[1] }}</strong> on chromosome <strong>{{ word.search_term[2] }}</strong> between <strong>{{ word.search_term[3] }}</strong> and <strong>{{ word.search_term[4] }}</strong> Mb{% if loop.last %}.{% else %} and {% endif %}
{% endif %}
{% elif word.key|lower == "position" %}
- with <u>target genes</u> on chromosome <strong>{% if word.search_term[0].split('chr')|length > 1 %}{{ word.search_term[0].split('chr')[1] }}{% elif word.search_term[0].split('CHR')|length > 1 %}{{ word.search_term[0].split('CHR')[1] }}{% else %}{{ word.search_term[0] }}{% endif %}</strong> between <strong>{{ word.search_term[1] }}</strong> and <strong>{{ word.search_term[2] }}</strong> Mb{% if not loop.last %} and {% endif %}
+ with <u>target genes</u> on chromosome <strong>{% if word.search_term[0].split('chr')|length > 1 %}{{ word.search_term[0].split('chr')[1] }}{% elif word.search_term[0].split('CHR')|length > 1 %}{{ word.search_term[0].split('CHR')[1] }}{% else %}{{ word.search_term[0] }}{% endif %}</strong> between <strong>{{ word.search_term[1] }}</strong> and <strong>{{ word.search_term[2] }}</strong> Mb{% if loop.last %}.{% else %} and {% endif %}
{% else %}
- with {{ word.key|lower }} matching {{ word.search_term[0] }}
+ that match the term {{ word.search_term[0] }}.
{% endif %}
- <!--<strong>{{word.search_term[0]}}</strong> {% if not loop.last %} or {% endif %}-->
- {% endfor %}.
-
- </p>
-
- <!--
- <ul>
- {% if search_terms %}
- <li>
- {% for word in search_terms %}
- <strong>{{word.search_term[0]}}</strong> {% if not loop.last %} or {% endif %}
{% endfor %}
- </li>
- {% endif %}
- </ul>
- -->
+ </p>
<p>To study a record, click on its ID below. Check records below and click Add button to add to selection.</p>
@@ -88,18 +75,18 @@
{% endif %}
-->
- <div id="table_container">
+ <div id="table_container" style="background-color: #eeeeee; border: 1px solid black;">
<table class="table table-hover table-striped" id='trait_table' {% if dataset.type == 'Geno' %}width="400px"{% endif %} style="float: left;">
<thead>
<tr>
- <th style="width: 30px;"></th>
+ <th style="background-color: #eeeeee;"></th>
{% for header in header_fields %}
{% if header == 'Max LRS' %}
- <th style="text-align: right;">Max&nbsp;&nbsp;<br>LRS</th>
+ <th style="background-color: #eeeeee; text-align: right;">Max<br>LRS</th>
{% elif header == 'Additive Effect' %}
- <th style="text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ <th style="background-color: #eeeeee; text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
{% else %}
- <th>{{header}}</th>
+ <th style="background-color: #eeeeee;">{{header}}</th>
{% endif %}
{% endfor %}
</tr>
@@ -144,7 +131,22 @@
</TR>
{% endfor %}
</tbody>
-
+ {% if trait_list|length > 20 %}
+ <tfoot>
+ <tr>
+ <th style="width: 30px;"></th>
+ {% for header in header_fields %}
+ {% if header == 'Max LRS' %}
+ <th style="text-align: right;">Max<br>LRS</th>
+ {% elif header == 'Additive Effect' %}
+ <th style="text-align: right;">Additive<br>Effect<a href="http://genenetwork.org//glossary.html#A" target="_blank"><sup style="color:#f00"> ?</sup></a></th>
+ {% else %}
+ <th>{{header}}</th>
+ {% endif %}
+ {% endfor %}
+ </tr>
+ </tfoot>
+ {% endif %}
</table>
</div>
</div>
@@ -161,13 +163,14 @@
<script language="javascript" type="text/javascript" src="https://cdn.datatables.net/1.10.8/js/jquery.dataTables.min.js"></script>
<script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script>
+ <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/scroller/1.4.1/js/dataTables.scroller.min.js"></script>
<script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.html5.min.js"></script>
<script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.naturalSort.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colResize.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colReorder.js"></script>
- <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.fixedHeader.js"></script>
+ <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.fixedHeader.min.js"></script>
<script language="javascript" type="text/javascript" src="//cdn.datatables.net/fixedcolumns/3.0.4/js/dataTables.fixedColumns.min.js"></script>
<script type="text/javascript" charset="utf-8">
@@ -219,6 +222,7 @@
console.time("Creating table");
{% if dataset.type == 'ProbeSet' %}
+ //ZS: Need to make sort by symbol, also need to make sure blank symbol fields at the bottom and symbols starting with numbers below letters
$('#trait_table').DataTable( {
"columns": [
{ "type": "natural" },
@@ -234,13 +238,21 @@
],
"order": [[1, "asc" ]],
"buttons": [
- 'csv'
+ {
+ extend: 'csvHtml5',
+ text: 'Download CSV',
+ title: 'search_results',
+ fieldBoundary: '"',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5, 6, 7, 8, 9]
+ }
+ }
],
"sDom": "RZBtir",
"iDisplayLength": -1,
"bDeferRender": true,
"bSortClasses": false,
- "scrollY": "700px",
+ "scrollY": true,
"scrollCollapse": false,
"paging": false
} );
@@ -260,7 +272,15 @@
],
"order": [[1, "asc" ]],
"buttons": [
- 'csv'
+ {
+ extend: 'csvHtml5',
+ text: 'Download CSV',
+ title: 'search_results',
+ fieldBoundary: '"',
+ exportOptions: {
+ columns: [1, 2, 3, 4, 5, 6, 7]
+ }
+ }
],
"sDom": "RZBtir",
"iDisplayLength": -1,
@@ -281,7 +301,15 @@
],
"order": [[1, "asc" ]],
"buttons": [
- 'csv'
+ {
+ extend: 'csvHtml5',
+ text: 'Download CSV',
+ title: 'search_results',
+ fieldBoundary: '"',
+ exportOptions: {
+ columns: [1, 2, 3]
+ }
+ }
],
"sDom": "RZBtir",
"iDisplayLength": -1,
diff --git a/wqflask/wqflask/templates/show_trait.html b/wqflask/wqflask/templates/show_trait.html
index 29239adb..1890cf3f 100755
--- a/wqflask/wqflask/templates/show_trait.html
+++ b/wqflask/wqflask/templates/show_trait.html
@@ -7,9 +7,8 @@
<link rel="stylesheet" type="text/css" href="/static/new/css/prob_plot.css" />
<link rel="stylesheet" type="text/css" href="/static/new/css/scatter-matrix.css" />
<link rel="stylesheet" type="text/css" href="/static/new/css/d3-tip.min.css" />
- <link rel="stylesheet" type="text/css" href="/static/new/packages/nvd3/nv.d3.min.css" />
+ <link rel="stylesheet" type="text/css" href="/static/new/packages/nvd3/nv.d3.css" />
<link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/css/jquery.dataTables.css" />
- <link rel="stylesheet" type="text/css" href="/static/new/packages/DataTables/extensions/buttons.bootstrap.css" />
<link rel="stylesheet" type="text/css" href="/static/new/packages/noUiSlider/nouislider.css" />
<link rel="stylesheet" type="text/css" href="/static/new/packages/noUiSlider/nouislider.pips.css" />
<link rel="stylesheet" type="text/css" href="/static/packages/DT_bootstrap/DT_bootstrap.css" />
@@ -17,15 +16,20 @@
{% endblock %}
{% block content %} <!-- Start of body -->
+<!--
{% if this_trait.dataset.type != 'Geno' %}
{{ header("{}".format(this_trait.name_header_fmt),
'{}: {}'.format(this_trait.name, this_trait.description_fmt)) }}
{% else %}
{{ header("{}".format(this_trait.name_header_fmt)) }}
{% endif %}
+-->
+ <div class="container">
+ <h2>Trait Data and Analysis for <b>{{ this_trait.name }}</b></h2>
+ <h3>{{ this_trait.description_fmt }}</h3>
+ </div>
-
- <form method="post" target="_blank" action="/corr_compute" name="trait_page" id="trait_data_form"
+ <form method="post" action="/corr_compute" target="_blank" name="trait_page" id="trait_data_form"
class="form-horizontal">
<div id="hidden_inputs">
<input type="hidden" name="trait_hmac" value="{{ data_hmac('{}:{}'.format(this_trait.name, dataset.name)) }}">
@@ -37,40 +41,50 @@
<input type="hidden" name="temp_uuid" id="temp_uuid" value="{{ temp_uuid }}">
<div class="container">
-
- {% include 'show_trait_details.html' %}
<div class="panel-group" id="accordion">
<div class="panel panel-default">
- <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseOne">
+ <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseOne" aria-expanded="true">
+ <h3 class="panel-title">
+ <span class="glyphicon glyphicon-chevron-down"></span> Details and Links
+ </h3>
+ </div>
+ <div id="collapseOne" class="panel-collapse collapse" aria-expanded="true">
+ <div class="panel-body">
+ {% include 'show_trait_details.html' %}
+ </div>
+ </div>
+ </div>
+ <div class="panel panel-default">
+ <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseTwo">
<h3 class="panel-title">
<span class="glyphicon glyphicon-chevron-down"></span> Statistics
</h3>
</div>
- <div id="collapseOne" class="panel-collapse collapse in">
+ <div id="collapseTwo" class="panel-collapse collapse in">
<div class="panel-body">
{% include 'show_trait_statistics.html' %}
</div>
</div>
</div>
<div class="panel panel-default">
- <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseTwo">
+ <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseThree">
<h3 class="panel-title">
<span class="glyphicon glyphicon-chevron-down"></span> Calculate Correlations
</h3>
</div>
- <div id="collapseTwo" class="panel-collapse collapse in">
+ <div id="collapseThree" class="panel-collapse collapse in">
<div class="panel-body">
{% include 'show_trait_calculate_correlations.html' %}
</div>
</div>
</div>
<div class="panel panel-default">
- <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseThree">
+ <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseFour">
<h3 class="panel-title">
<span class="glyphicon glyphicon-chevron-down"></span> Mapping Tools
</h3>
</div>
- <div id="collapseThree" class="panel-collapse collapse in">
+ <div id="collapseFour" class="panel-collapse collapse in">
<div class="panel-body">
{% include 'show_trait_mapping_tools.html' %}
</div>
@@ -78,12 +92,12 @@
</div>
</div>
<div class="panel panel-default">
- <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseFour" aria-expanded="true">
+ <div class="panel-heading" data-toggle="collapse" data-parent="#accordion" data-target="#collapseFive" aria-expanded="true">
<h3 class="panel-title">
<span class="glyphicon glyphicon-chevron-up"></span> Review and Edit Data
</h3>
</div>
- <div id="collapseFour" class="panel-collapse collapse" aria-expanded="true">
+ <div id="collapseFive" class="panel-collapse collapse" aria-expanded="true">
<div class="panel-body">
{% include 'show_trait_edit_data.html' %}
</div>
@@ -134,10 +148,6 @@
<script language="javascript" type="text/javascript" src="/static/new/packages/jsPDF/jspdf.plugin.from_html.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.js"></script>
- <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/dataTables.buttons.min.js"></script>
- <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.html5.min.js"></script>
- <script language="javascript" type="text/javascript" src="https://cdn.datatables.net/buttons/1.0.0/js/buttons.bootstrap.min.js"></script>
- <script language="javascript" type="text/javascript" src="/static/new/js_external/jszip.min.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.scientific.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/dataTables.naturalSort.js"></script>
<script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/extensions/dataTables.colResize.js"></script>
@@ -198,12 +208,12 @@
{ "type": "natural" },
{ "type": "cust-txt" },
{ "bSortable": false },
- { "type": "cust-txt" }
+ { "type": "cust-txt" }{% if sample_groups[0].attributes|length > 0 %},{% endif %}
+ {% for attribute in sample_groups[0].attributes %}
+ { "type": "natural" }{% if loop.index < sample_groups[0].attributes|length %},{% endif %}
+ {% endfor %}
],
- "buttons": [
- 'csv'
- ],
- "sDom": "RZBtr",
+ "sDom": "RZtr",
"iDisplayLength": -1,
"autoWidth": false,
"bLengthChange": true,
@@ -224,12 +234,12 @@
{ "bSortable": false },
{ "type": "natural" },
null,
- { "type": "cust-txt" }
- ],
- "buttons": [
- 'csv'
+ { "type": "cust-txt" }{% if sample_groups[0].attributes|length > 0 %},{% endif %}
+ {% for attribute in sample_groups[0].attributes %}
+ { "type": "natural" }{% if loop.index < sample_groups[0].attributes|length %},{% endif %}
+ {% endfor %}
],
- "sDom": "RZBtr",
+ "sDom": "RZtr",
"iDisplayLength": -1,
"autoWidth": false,
"bLengthChange": true,
@@ -244,42 +254,33 @@
} );
{% endif %}
- console.log("SAMPLE GROUP TYPES:", js_data.sample_group_types)
if (Object.keys(js_data.sample_group_types).length > 1) {
$('#stats_table').DataTable( {
- "columns": [
- { "bSortable": false },
- { "bSortable": false },
- { "bSortable": false },
- { "bSortable": false }
+ "columnDefs": [
+ { "orderable": false, "targets": [0, 1, 2, 3] }
],
- "sDom": "RZtr",
+ "order": [],
+ "sDom": "tr",
"iDisplayLength": -1,
"autoWidth": false,
"bLengthChange": true,
"bDeferRender": true,
"bSortClasses": false,
- "colResize": {
- "tableWidthFixed": false
- },
"paging": false
} );
}
else {
$('#stats_table').DataTable( {
- "columns": [
- { "bSortable": false },
- { "bSortable": false }
+ "columnDefs": [
+ { "orderable": false, "targets": [0, 1] }
],
- "sDom": "RZtr",
+ "order": [],
+ "sDom": "tr",
"iDisplayLength": -1,
"autoWidth": false,
"bLengthChange": true,
"bDeferRender": true,
"bSortClasses": false,
- "colResize": {
- "tableWidthFixed": false
- },
"paging": false
} );
diff --git a/wqflask/wqflask/templates/show_trait_calculate_correlations.html b/wqflask/wqflask/templates/show_trait_calculate_correlations.html
index a7edbc48..0e15ce9c 100755
--- a/wqflask/wqflask/templates/show_trait_calculate_correlations.html
+++ b/wqflask/wqflask/templates/show_trait_calculate_correlations.html
@@ -63,7 +63,7 @@
</div>
</div>
- <div class="form-group">
+ <div id="corr_sample_method" class="form-group">
<label for="corr_sample_method" class="col-xs-1 control-label">Type</label>
<div class="col-xs-2 controls">
<select name="corr_sample_method" class="form-control">
@@ -90,19 +90,22 @@
</div>
<div class="form-group">
<label class="col-xs-1 control-label">Range</label>
- <div class="col-xs-3 controls">
+ <div class="col-xs-4 controls">
<input name="p_range_lower" value="" type="hidden">
<input name="p_range_upper" value="" type="hidden">
- <div id="p_range_slider" ></div>
- <span style="font: 400 12px Arial; color: #888; display: block; margin: 15px 0;" id="p_range_lower"></span>
- <span style="font: 400 12px Arial; color: #888; display: block; margin: 15px 0;" id="p_range_upper"></span>
+ <span style="display: inline;">
+ <div id="p_range_slider" style="width: 200px;"></div>
+ <span style="font: 400 12px Arial; color: #888; display: inline; margin: 25px 0; width: 20px;" id="p_range_lower"></span>
+ <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
+ <span style="font: 400 12px Arial; color: #888; display: inline; margin: 15px 0; width: 20px;" id="p_range_upper"></span>
+ </span>
</div>
</div>
<div class="form-group">
<label for="corr_sample_method" class="col-xs-1 control-label"></label>
<div class="col-xs-4 controls">
- <button class="btn submit_special btn-primary" data-url="/corr_compute" title="Compute Correlation">
+ <button class="btn corr_compute submit_special btn-primary" data-url="/corr_compute" title="Compute Correlation">
<i class="icon-ok-circle icon-white"></i> Compute
</button>
</div>
@@ -112,30 +115,30 @@
<label for="descriptions" class="col-xs-1 control-label"></label>
<div class="col-xs-6 controls">
<span id="sample_r_desc" class="correlation_desc fs12">
- The <a href="/correlationAnnotation.html#sample_r" target="_blank">Sample Correlation</a>
+ The <a href="http://genenetwork.org/correlationAnnotation.html#genetic_r">Sample Correlation</a>
is computed
between trait data and any
other traits in the sample database selected above. Use
- <a href="/glossary.html#Correlations" target="_blank">Spearman
+ <a href="http://www.genenetwork.org/glossary.html#Correlations">Spearman
Rank</a>
when the sample size is small (&lt;20) or when there are influential outliers.
</span>
<span id="lit_r_desc" style="display: none;" class="correlation_desc fs12">
- The <a href="/correlationAnnotation.html" target="_blank">Literature Correlation</a>
+ The <a href="http://genenetwork.org/correlationAnnotation.html#literatureCorr">Literature Correlation</a>
(Lit r) between
this gene and all other genes is computed<br>
- using the <a href="https://grits.eecs.utk.edu/sgo/sgo.html" target="_blank">
+ using the <a href="https://grits.eecs.utk.edu/sgo/sgo.html">
Semantic Gene Organizer</a>
and human, rat, and mouse data from PubMed.
Values are ranked by Lit r, but Sample r and Tissue r are also displayed.<br>
- <a href="/glossary.html#Literature" target="_blank">More on using Lit r</a>
+ <a href="http://genenetwork.org/glossary.html#Literature">More on using Lit r</a>
</span>
<span id="tissue_r_desc" style="display: none;" class="correlation_desc fs12">
- The <a href="/webqtl/main.py?FormID=tissueCorrelation" target="_blank">Tissue Correlation</a>
+ The <a href="http://genenetwork.org/webqtl/main.py?FormID=tissueCorrelation">Tissue Correlation</a>
(Tissue r)
estimates the similarity of expression of two genes
or transcripts across different cells, tissues, or organs
- (<a href="/correlationAnnotation.html#tissue_r" target="_blank">glossary</a>).
+ (<a href="http://genenetwork.org/correlationAnnotation.html#tissueCorr">glossary</a>).
Tissue correlations
are generated by analyzing expression in multiple samples usually taken from single cases.<br>
<strong>Pearson</strong> and <strong>Spearman Rank</strong> correlations have been
diff --git a/wqflask/wqflask/templates/show_trait_details.html b/wqflask/wqflask/templates/show_trait_details.html
index 16c5dc47..d5fb0cf2 100755
--- a/wqflask/wqflask/templates/show_trait_details.html
+++ b/wqflask/wqflask/templates/show_trait_details.html
@@ -1,71 +1,81 @@
-<dl class="dl-horizontal">
- <dt>Species</dt>
- <dd>{{ this_trait.dataset.group.species }}</dd>
- <dt>Group</dt>
- <dd>{{ this_trait.dataset.group.name }}</dd>
- <dt>Tissue</dt>
- <dd>{{ this_trait.dataset.tissue }}</dd>
+<table class="table">
+ <tr>
+ <td>Species</td>
+ <td>{{ this_trait.dataset.group.species }}</td>
+ </tr>
+ <tr>
+ <td>Group</td>
+ <td>{{ this_trait.dataset.group.name }}</td>
+ </tr>
+ <tr>
+ <td>Tissue</td>
+ <td>{{ this_trait.dataset.tissue }}</td>
+ </tr>
{% if this_trait.dataset.type == 'ProbeSet' %}
- <dt>Aliases</dt>
- <dd>{{ this_trait.alias_fmt }}</dd>
+ <tr>
+ <td>Aliases</td>
+ <td>{{ this_trait.alias_fmt|replace(",",";") }}</td>
+ </tr>
{% endif %}
-
{% if this_trait.dataset.type != 'Publish' %}
- <dt>Location</dt>
- <dd>{{ this_trait.location_fmt }}</dd>
+ <tr>
+ <td>Location</td>
+ <td>{{ this_trait.location_fmt }}</td>
+ </tr>
{% endif %}
-
- <dt>Database</dt>
- <dd>
- <a href="{{ url_for('static', filename='dbdoc/' + dataset.fullname + '.html') }}" target="_blank">
- {{ dataset.name }}
- </a>
- </dd>
-
+ <tr>
+ <td>Database</td>
+ <td>
+ <a href="http://genenetwork.org/dbdoc/{{ dataset.name }}.html">
+ {{ dataset.fullname }}
+ </a>
+ </td>
+ </tr>
{% if this_trait.probe_set_specificity %}
- <dt>
- <a href="/blatInfo.html" target="_blank"
- title="Values higher than 2 for the specificity are good">
- BLAT Specificity
- </a>
- </dt>
- <dd>{{ "%0.3f" | format(this_trait.probe_set_specificity|float) }}</dd>
+ <tr>
+ <td>Target Score</td>
+ <td>
+ <a href="http://genenetwork.org/blatInfo.html" title="Values higher than 2 for the specificity are good">
+ BLAT Specificity
+ </a>:
+ {{ "%0.3f" | format(this_trait.probe_set_specificity|float) }}
+ &nbsp;&nbsp;
+ {% if this_trait.probe_set_blat_score %}
+ Score: {{ "%0.3f" | format(this_trait.probe_set_blat_score|float) }}
+ {% endif %}
+ </td>
+ </tr>
{% endif %}
- {% if this_trait.probe_set_blat_score %}
- <dt>BLAT Score</dt>
- <dd>{{ "%0.3f" | format(this_trait.probe_set_blat_score|float) }}</dd>
- {% endif %}
- <dt>Resource Links</dt>
- {% if this_trait.dataset.type == 'ProbeSet' %}
- <dd>
- {% if this_trait.geneid != None %}
- <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=Graphics&list_uids={{ this_trait.geneid }}" target="_blank" title="Info from NCBI Entrez Gene">
- Gene
- </a>
- &nbsp;&nbsp;
+ <tr>
+ <td>Resource Links</td>
+ <td>
+ {% if this_trait.geneid != None %}
+ <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=Graphics&list_uids={{ this_trait.geneid }}" title="Info from NCBI Entrez Gene">
+ Gene
+ </a>
+ &nbsp;&nbsp;
+ {% endif %}
+ {% if this_trait.omim != None %}
+ <a href="http://www.ncbi.nlm.nih.gov/omim/{{ this_trait.omim }}" title="Summary from On Mendelion Inheritance in Man">
+ OMIM
+ </a>
+ &nbsp;&nbsp;
+ {% endif %}
+ {% if this_trait.genbankid != None %}
+ <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=Nucleotide&cmd=search&doptcmdl=DocSum&term={{ this_trait.genbankid }}" title="Find the original GenBank sequence used to design the probes">
+ GenBank
+ </a>
+ &nbsp;&nbsp;
+ {% endif %}
+ {% if this_trait.symbol != None %}
+ <a href="http://www.genotation.org/Getd2g.pl?gene_list={{ this_trait.symbol }}" title="Related descriptive, genomic, clinical, functional and drug-therapy information">
+ Genotation
+ </a>
+ &nbsp;&nbsp;
{% endif %}
- {% if this_trait.omim != None %}
- <a href="http://www.ncbi.nlm.nih.gov/omim/{{ this_trait.omim }}" target="_blank" title="Summary from On Mendelion Inheritance in Man">
- OMIM
- </a>
- &nbsp;&nbsp;
- {% endif %}
- {% if this_trait.genbankid != None %}
- <a href="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=Nucleotide&cmd=search&doptcmdl=DocSum&term={{ this_trait.genbankid }}" target="_blank" title="Find the original GenBank sequence used to design the probes">
- GenBank
- </a>
- &nbsp;&nbsp;
- {% endif %}
- {% if this_trait.symbol != None %}
- <a href="http://www.genotation.org/Getd2g.pl?gene_list={{ this_trait.symbol }}" target="_blank" title="Related descriptive, genomic, clinical, functional and drug-therapy information">
- Genotation
- </a>
- &nbsp;&nbsp;
- {% endif %}
- </dd>
- {% endif %}
-</dl>
-
+ </td>
+ </tr>
+</table>
<div style="margin-bottom:15px;" class="btn-toolbar">
<div class="btn-group">
@@ -76,40 +86,40 @@
</a>
{% if this_trait.dataset.type == 'ProbeSet' %}
{% if this_trait.symbol != None %}
- <a href="#redirect" onclick="window.open('http://www.genenetwork.org/webqtl/main.py?cmd=sch&amp;gene={{ this_trait.symbol }}&amp;alias=1&amp;species={{ species_name }}')">
+ <a href="http://www.genenetwork.org/webqtl/main.py?cmd=sch&amp;gene={{ this_trait.symbol }}&amp;alias=1&amp;species={{ species_name }}">
<button type="button" class="btn btn-default" title="Find similar expression data">
<i class="icon-search"></i> Find
</button>
</a>
{% endif %}
{% if UCSC_BLAT_URL != "" %}
- <a href="#redirect" onclick="window.open('{{ UCSC_BLAT_URL }}')">
+ <a href="{{ UCSC_BLAT_URL }}">
<button type="button" class="btn btn-default" title="Check probe locations at UCSC">
<i class="icon-ok"></i> Verify
</button>
</a>
{% endif %}
{% if this_trait.symbol != None %}
- <a href="#redirect" onclick="window.open('http://genenetwork.org/webqtl/main.py?FormID=geneWiki&symbol={{ this_trait.symbol }}')">
+ <a href="http://genenetwork.org/webqtl/main.py?FormID=geneWiki&symbol={{ this_trait.symbol }}">
<button type="button" class="btn btn-default" title="Write or review comments about this gene">
<i class="icon-edit"></i> GeneWiki
</button>
</a>
- <a href="#redirect" onclick="window.open('http://genenetwork.org/webqtl/main.py?FormID=SnpBrowserResultPage&submitStatus=1&diffAlleles=True&customStrain=True&geneName={{ this_trait.symbol }}')">
+ <a href="http://genenetwork.org/webqtl/main.py?FormID=SnpBrowserResultPage&submitStatus=1&diffAlleles=True&customStrain=True&geneName={{ this_trait.symbol }}">
<button type="button" class="btn btn-default" title="View SNPs and Indels">
<i class="icon-road"></i> SNPs
</button>
</a>
{% endif %}
{% if UTHSC_BLAT_URL != "" %}
- <a href="#redirect" onclick="window.open('{{ UTHSC_BLAT_URL }}')">
+ <a href="{{ UTHSC_BLAT_URL }}">
<button type="button" class="btn btn-default" title="View probes, SNPs, and RNA-seq at UTHSC">
<i class="icon-eye-close"></i> RNA-seq
</button>
</a>
{% endif %}
{% if show_probes == "True" %}
- <a href="#redirect" onclick="window.open('http://genenetwork.org/webqtl/main.py?FormID=showProbeInfo&database={{ this_trait.dataset.name }}&ProbeSetID={{ this_trait.name }}&CellID={{ this_trait.cellid }}&RISet={{ dataset.group.name }}&incparentsf1=ON')">
+ <a href="http://genenetwork.org/webqtl/main.py?FormID=showProbeInfo&database={{ this_trait.dataset.name }}&ProbeSetID={{ this_trait.name }}&CellID={{ this_trait.cellid }}&RISet={{ dataset.group.name }}&incparentsf1=ON">
<button type="button" class="btn btn-default" title="Check sequence of probes">
<i class="icon-list"></i> Probes
</button>
diff --git a/wqflask/wqflask/templates/show_trait_edit_data.html b/wqflask/wqflask/templates/show_trait_edit_data.html
index d39df976..ff5f0c87 100755
--- a/wqflask/wqflask/templates/show_trait_edit_data.html
+++ b/wqflask/wqflask/templates/show_trait_edit_data.html
@@ -75,22 +75,22 @@
<!--<div id="edit_sample_lists">-->
{% for sample_type in sample_groups %}
- <div class="sample_group" style="width:50%;">
+ <div class="sample_group" style="width:{{ trait_table_width }}%;">
<h3>{{ sample_type.header }}</h3>
-
+ <div id="table_container" style="background-color: #eeeeee; border: 1px solid black;">
<table class="table-hover table-striped" id="samples_{{ sample_type.sample_group_type }}" style="float: left;">
<thead>
<tr>
- <th></th>
- <th>Index</th>
- <th>Sample</th>
- <th>Value</th>
+ <th style="background-color: #eeeeee;"></th>
+ <th style="background-color: #eeeeee;">Index</th>
+ <th style="background-color: #eeeeee;">Sample</th>
+ <th style="background-color: #eeeeee;">Value</th>
{% if sample_type.se_exists() %}
- <th>&nbsp;</th>
- <th>SE</th>
+ <th style="background-color: #eeeeee;">&nbsp;</th>
+ <th style="background-color: #eeeeee;">SE</th>
{% endif %}
{% for attribute in sample_type.attributes|sort() %}
- <th>
+ <th style="background-color: #eeeeee;">
{{ sample_type.attributes[attribute].name }}
</th>
{% endfor %}
@@ -144,6 +144,7 @@
{% endfor %}
</tbody>
</table>
+ </div>
</div>
{% endfor %}
<!--</div>-->
diff --git a/wqflask/wqflask/templates/show_trait_mapping_tools.html b/wqflask/wqflask/templates/show_trait_mapping_tools.html
index c23cb010..3d9c2521 100755
--- a/wqflask/wqflask/templates/show_trait_mapping_tools.html
+++ b/wqflask/wqflask/templates/show_trait_mapping_tools.html
@@ -6,13 +6,13 @@
<ul class="nav nav-pills">
{% if use_pylmm_rqtl and not use_plink_gemma and dataset.group.species != "human" %}
<li class="active">
- <a href="#pylmm" data-toggle="tab">pyLMM</a>
+ <a href="#interval_mapping" data-toggle="tab">Interval Mapping</a>
</li>
<li>
- <a href="#rqtl_geno" data-toggle="tab">R/qtl</a>
+ <a href="#pylmm" data-toggle="tab">pyLMM</a>
</li>
<li>
- <a href="#interval_mapping" data-toggle="tab">Interval Mapping</a>
+ <a href="#rqtl_geno" data-toggle="tab">R/qtl</a>
</li>
{% endif %}
{% if use_plink_gemma %}
@@ -30,7 +30,89 @@
<div class="tab-content">
{% if use_pylmm_rqtl and not use_plink_gemma and dataset.group.species != "human" %}
- <div class="tab-pane active" id="pylmm">
+ <div class="tab-pane active" id="interval_mapping">
+ <div style="margin-top: 20px" class="form-horizontal">
+ <div class="mapping_method_fields form-group">
+ <label for="mapping_permutations" class="col-xs-3 control-label">Permutations</label>
+ <div style="margin-left: 20px;" class="col-xs-4 controls">
+ <input name="num_perm_reaper" value="2000" type="text" class="form-control">
+ </div>
+ </div>
+ <div class="mapping_method_fields form-group">
+ <label for="mapping_bootstraps" class="col-xs-3 control-label">Bootstraps</label>
+ <div style="margin-left: 20px;" class="col-xs-4 controls">
+ <input name="num_bootstrap" value="2000" type="text" class="form-control">
+ </div>
+ </div>
+ <div class="mapping_method_fields form-group">
+ <label for="control_for" class="col-xs-3 control-label">Control&nbsp;for</label>
+ <div style="margin-left: 20px;" class="col-xs-4 controls">
+ {% if dataset.type == 'ProbeSet' and this_trait.locus_chr != "" %}
+ <input name="control_reaper" value="{{ nearest_marker }}" type="text" style="width: 160px;" class="form-control" />
+ {% else %}
+ <input name="control_reaper" value="" type="text" class="form-control" />
+ {% endif %}
+ <label class="radio-inline">
+ <input type="radio" name="do_control_reaper" value="true">
+ Yes
+ </label>
+ <label class="radio-inline">
+ <input type="radio" name="do_control_reaper" value="false" checked="">
+ No
+ </label>
+ </div>
+ </div>
+
+<!--
+ <div class="mapping_method_fields form-group">
+ <label for="mapping_bootstraps" class="col-xs-3 control-label" title="Bootstrapping Resamples">Bootstrap Test (n=2000)</label>
+ <div class="col-xs-4 controls">
+ <label>
+ <input type="checkbox" name="bootCheck" id="bootCheck"> Bootstrap Test (n=2000)
+ </label>
+ </div>
+ </div>
+
+ <div class="mapping_method_fields form-group">
+ <label style="text-align:left;" class="col-xs-12 control-label">Display Additive Effect</label>
+ <div class="col-xs-12 controls" id="display_additive_effect">
+ <label class="radio-inline">
+ <input type="radio" name="display_additive" id="display_additive" value="yes" checked="">
+ Yes
+ </label>
+ <label class="radio-inline">
+ <input type="radio" name="display_additive" id="display_additive" value="no">
+ No
+ </label>
+ </div>
+ </div>
+-->
+
+
+ <div class="mapping_method_fields form-group">
+ <label style="text-align:left;" class="col-xs-12 control-label">Marker Regr.</label>
+ <div class="col-xs-12 controls">
+ <label class="radio-inline">
+ <input type="radio" name="manhattan_plot_reaper" value="True">
+ Yes
+ </label>
+ <label class="radio-inline">
+ <input type="radio" name="manhattan_plot_reaper" value="False" checked="">
+ No
+ </label>
+ </div>
+ </div>
+ <div class="form-group">
+ <div style="padding-left:15px;" class="controls">
+ <button id="interval_mapping_compute" class="btn submit_special btn-primary" data-url="/marker_regression" title="Compute Interval Mapping">
+ <i class="icon-ok-circle icon-white"></i> Compute
+ </button>
+ </div>
+ </div>
+ <!--<div id="alert_placeholder"></div>-->
+ </div>
+ </div>
+ <div class="tab-pane" id="pylmm">
<div style="margin-top: 20px" class="form-horizontal">
<div class="mapping_method_fields form-group">
<label for="mapping_permutations" class="col-xs-3 control-label">Permutations</label>
@@ -66,11 +148,11 @@
<label style="text-align:left;" class="col-xs-12 control-label">Manhattan Plot</label>
<div class="col-xs-12 controls">
<label class="radio-inline">
- <input type="radio" name="manhattan_plot_pylmm" value="true">
+ <input type="radio" name="manhattan_plot_pylmm" value="True">
Yes
</label>
<label class="radio-inline">
- <input type="radio" name="manhattan_plot_pylmm" value="false" checked="">
+ <input type="radio" name="manhattan_plot_pylmm" value="False" checked="">
No
</label>
</div>
@@ -160,11 +242,11 @@
<label style="text-align:left;" class="col-xs-12 control-label">Manhattan Plot</label>
<div class="col-xs-12 controls">
<label class="radio-inline">
- <input type="radio" name="manhattan_plot_rqtl" value="true">
+ <input type="radio" name="manhattan_plot_rqtl" value="True">
Yes
</label>
<label class="radio-inline">
- <input type="radio" name="manhattan_plot_rqtl" value="false" checked="">
+ <input type="radio" name="manhattan_plot_rqtl" value="False" checked="">
No
</label>
</div>
@@ -179,85 +261,13 @@
</div>
</div>
</div>
- <div class="tab-pane" id="interval_mapping">
- <div style="margin-top: 20px" class="form-horizontal">
- <div class="mapping_method_fields form-group">
- <label for="mapping_permutations" class="col-xs-3 control-label">Permutations</label>
- <div style="margin-left: 20px;" class="col-xs-4 controls">
- <input name="num_perm_reaper" value="2000" type="text" class="form-control">
- </div>
- </div>
- <div class="mapping_method_fields form-group">
- <label for="control_for" class="col-xs-3 control-label">Control&nbsp;for</label>
- <div style="margin-left: 20px;" class="col-xs-4 controls">
- {% if dataset.type == 'ProbeSet' and this_trait.locus_chr != "" %}
- <input name="control_reaper" value="{{ nearest_marker }}" type="text" style="width: 160px;" class="form-control" />
- {% else %}
- <input name="control_reaper" value="" type="text" class="form-control" />
- {% endif %}
- <label class="radio-inline">
- <input type="radio" name="do_control_reaper" value="true">
- Yes
- </label>
- <label class="radio-inline">
- <input type="radio" name="do_control_reaper" value="false" checked="">
- No
- </label>
- </div>
- </div>
-<!--
- <div class="mapping_method_fields form-group">
- <label for="mapping_bootstraps" class="col-xs-3 control-label" title="Bootstrapping Resamples">Bootstrap</label>
- <div style="margin-left: 20px;" class="col-xs-4 controls">
- <input name="mapping_bootstraps" value="2000" type="text" class="form-control">
- </div>
- </div>
-
- <div class="mapping_method_fields form-group">
- <label style="text-align:left;" class="col-xs-12 control-label">Display Additive Effect</label>
- <div class="col-xs-12 controls" id="display_additive_effect">
- <label class="radio-inline">
- <input type="radio" name="display_additive" id="display_additive" value="yes" checked="">
- Yes
- </label>
- <label class="radio-inline">
- <input type="radio" name="display_additive" id="display_additive" value="no">
- No
- </label>
- </div>
- </div>
--->
-
- <div class="mapping_method_fields form-group">
- <label style="text-align:left;" class="col-xs-12 control-label">Manhattan Plot</label>
- <div class="col-xs-12 controls">
- <label class="radio-inline">
- <input type="radio" name="manhattan_plot_reaper" value="true">
- Yes
- </label>
- <label class="radio-inline">
- <input type="radio" name="manhattan_plot_reaper" value="false" checked="">
- No
- </label>
- </div>
- </div>
- <div class="form-group">
- <div style="padding-left:15px;" class="controls">
- <button id="interval_mapping_compute" class="btn submit_special btn-primary" data-url="/marker_regression" title="Compute Interval Mapping">
- <i class="icon-ok-circle icon-white"></i> Compute
- </button>
- </div>
- </div>
- <!--<div id="alert_placeholder"></div>-->
- </div>
- </div>
{% endif %}
{% if use_plink_gemma %}
<div class="tab-pane" id="plink">
<div style="padding: 20px" class="form-horizontal">
<div class="mapping_method_fields form-group">
- <label for="maf_plink" class="col-xs-2 control-label">Minor allele threshold</label>
- <div style="margin-left: 20px;" class="col-xs-2 controls">
+ <label for="maf_plink" class="col-xs-3 control-label">Minor allele threshold</label>
+ <div style="margin-left: 20px;" class="col-xs-3 controls">
<input name="maf_plink" value="0.01" type="text" class="form-control">
</div>
</div>
@@ -276,8 +286,8 @@
<div class="tab-pane" id="gemma">
<div style="padding: 20px" class="form-horizontal">
<div class="mapping_method_fields form-group">
- <label for="maf_gemma" class="col-xs-2 control-label">Minor allele threshold</label>
- <div style="margin-left: 20px;" class="col-xs-2 controls">
+ <label for="maf_gemma" class="col-xs-3 control-label">Minor allele threshold</label>
+ <div style="margin-left: 20px;" class="col-xs-3 controls">
<input name="maf_gemma" value="0.01" type="text" class="form-control">
</div>
</div>
diff --git a/wqflask/wqflask/templates/show_trait_statistics.html b/wqflask/wqflask/templates/show_trait_statistics.html
index 2183dd30..3ee8bdea 100755
--- a/wqflask/wqflask/templates/show_trait_statistics.html
+++ b/wqflask/wqflask/templates/show_trait_statistics.html
@@ -26,8 +26,7 @@
<div class="tab-content">
<div class="tab-pane active" id="stats_tab">
<div style="padding: 20px" class="form-horizontal">
- <table id="stats_table" style="width: 300px; float: left;" class="table table-hover table-striped"></table>
-
+ <table border="1" id="stats_table" style="width: 300px; float: left;" class="table table-hover table-striped cell-border"></table>
</div>
</div>
<div class="tab-pane" id="histogram_tab">
@@ -109,8 +108,8 @@
</div>
<div>
- More about <a href="http://en.wikipedia.org/wiki/Normal_probability_plot" target="_blank">Normal Probability Plots</a> and more
- about interpreting these plots from the <a href="/glossary.html#normal_probability" target="_blank">glossary</a>
+ More about <a href="http://en.wikipedia.org/wiki/Normal_probability_plot">Normal Probability Plots</a> and more
+ about interpreting these plots from the <a href="http://genenetwork.org/glossary.html#normal_probability">glossary</a>
</div>
</div>
diff --git a/wqflask/wqflask/templates/wgcna_setup.html b/wqflask/wqflask/templates/wgcna_setup.html
index 8ab8c4a0..b4a5730d 100644
--- a/wqflask/wqflask/templates/wgcna_setup.html
+++ b/wqflask/wqflask/templates/wgcna_setup.html
@@ -17,36 +17,36 @@
{% else %}
<form action="/wgcna_results" method="post" class="form-horizontal">
<input type="hidden" name="trait_list" id="trait_list" value= "{{request.form['trait_list']}}">
- <div class="form-group">
+ <div class="form-group">
<label for="SoftThresholds"> Soft threshold: </label>
<div class="col-sm-10">
<input type="text" class="form-inline" name="SoftThresholds" id="SoftThresholds" value="1,2,3,4,5,6,7,8,9">
</div>
</div>
- <div class="form-group">
+ <div class="form-group">
<label for="MinModuleSize"> Minimum module size: </label>
<div class="col-sm-10">
<input type="text" class="form-inline" name="MinModuleSize" id="MinModuleSize" value="30">
</div>
</div>
- <div class="form-group">
+ <div class="form-group">
<label for="TOMtype"> TOMtype: </label>
<div class="col-sm-10">
<input type="text" class="form-inline" name="TOMtype" id="TOMtype" value="unsigned">
</div>
- </div>
- <div class="form-group">
+ </div>
+ <div class="form-group">
<label for="mergeCutHeight"> mergeCutHeight: </label>
<div class="col-sm-10">
<input type="text" class="form-inline" name="mergeCutHeight" id="mergeCutHeight" value="0.25">
</div>
- </div>
- <div class="form-group">
+ </div>
+ <div class="form-group">
<div class="col-sm-10">
<input type="submit" class="btn btn-primary" value="Run WGCNA using these settings" />
</div>
- </div>
- </form>
+ </div>
+ </form>
{% endif %}
</div>
{% endblock %}
diff --git a/wqflask/wqflask/update_search_results.py b/wqflask/wqflask/update_search_results.py
new file mode 100644
index 00000000..ffd7fd51
--- /dev/null
+++ b/wqflask/wqflask/update_search_results.py
@@ -0,0 +1,129 @@
+from __future__ import absolute_import, print_function, division
+
+import json
+
+from flask import Flask, g
+from base.data_set import create_dataset
+from base.trait import GeneralTrait
+from dbFunction import webqtlDatabaseFunction
+
+from utility.benchmark import Bench
+
+class GSearch(object):
+
+ def __init__(self, kw):
+ self.type = kw['type']
+ self.terms = kw['terms']
+ #self.row_range = kw['row_range']
+ if self.type == "gene":
+ sql = """
+ SELECT
+ Species.`Name` AS species_name,
+ InbredSet.`Name` AS inbredset_name,
+ Tissue.`Name` AS tissue_name,
+ ProbeSetFreeze.Name AS probesetfreeze_name,
+ ProbeSet.Name AS probeset_name,
+ ProbeSet.Symbol AS probeset_symbol,
+ ProbeSet.`description` AS probeset_description,
+ ProbeSet.Chr AS chr,
+ ProbeSet.Mb AS mb,
+ ProbeSetXRef.Mean AS mean,
+ ProbeSetXRef.LRS AS lrs,
+ ProbeSetXRef.`Locus` AS locus,
+ ProbeSetXRef.`pValue` AS pvalue,
+ ProbeSetXRef.`additive` AS additive
+ FROM Species, InbredSet, ProbeSetXRef, ProbeSet, ProbeFreeze, ProbeSetFreeze, Tissue
+ WHERE InbredSet.`SpeciesId`=Species.`Id`
+ AND ProbeFreeze.InbredSetId=InbredSet.`Id`
+ AND ProbeFreeze.`TissueId`=Tissue.`Id`
+ AND ProbeSetFreeze.ProbeFreezeId=ProbeFreeze.Id
+ AND ( MATCH (ProbeSet.Name,ProbeSet.description,ProbeSet.symbol,alias,GenbankId, UniGeneId, Probe_Target_Description) AGAINST ('%s' IN BOOLEAN MODE) )
+ AND ProbeSet.Id = ProbeSetXRef.ProbeSetId
+ AND ProbeSetXRef.ProbeSetFreezeId=ProbeSetFreeze.Id
+ AND ProbeSetFreeze.public > 0
+ ORDER BY species_name, inbredset_name, tissue_name, probesetfreeze_name, probeset_name
+ LIMIT 6000
+ """ % (self.terms)
+ with Bench("Running query"):
+ re = g.db.execute(sql).fetchall()
+ self.trait_list = []
+ with Bench("Creating trait objects"):
+ for line in re:
+ dataset = create_dataset(line[3], "ProbeSet", get_samplelist=False)
+ trait_id = line[4]
+ #with Bench("Building trait object"):
+ this_trait = GeneralTrait(dataset=dataset, name=trait_id, get_qtl_info=True, get_sample_info=False)
+ self.trait_list.append(this_trait)
+
+ elif self.type == "phenotype":
+ sql = """
+ SELECT
+ Species.`Name`,
+ InbredSet.`Name`,
+ PublishFreeze.`Name`,
+ PublishXRef.`Id`,
+ Phenotype.`Post_publication_description`,
+ Publication.`Authors`,
+ Publication.`Year`,
+ PublishXRef.`LRS`,
+ PublishXRef.`Locus`,
+ PublishXRef.`additive`
+ FROM Species,InbredSet,PublishFreeze,PublishXRef,Phenotype,Publication
+ WHERE PublishXRef.`InbredSetId`=InbredSet.`Id`
+ AND PublishFreeze.`InbredSetId`=InbredSet.`Id`
+ AND InbredSet.`SpeciesId`=Species.`Id`
+ AND PublishXRef.`PhenotypeId`=Phenotype.`Id`
+ AND PublishXRef.`PublicationId`=Publication.`Id`
+ AND (Phenotype.Post_publication_description REGEXP "[[:<:]]%s[[:>:]]"
+ OR Phenotype.Pre_publication_description REGEXP "[[:<:]]%s[[:>:]]"
+ OR Phenotype.Pre_publication_abbreviation REGEXP "[[:<:]]%s[[:>:]]"
+ OR Phenotype.Post_publication_abbreviation REGEXP "[[:<:]]%s[[:>:]]"
+ OR Phenotype.Lab_code REGEXP "[[:<:]]%s[[:>:]]"
+ OR Publication.PubMed_ID REGEXP "[[:<:]]%s[[:>:]]"
+ OR Publication.Abstract REGEXP "[[:<:]]%s[[:>:]]"
+ OR Publication.Title REGEXP "[[:<:]]%s[[:>:]]"
+ OR Publication.Authors REGEXP "[[:<:]]%s[[:>:]]"
+ OR PublishXRef.Id REGEXP "[[:<:]]%s[[:>:]]")
+ ORDER BY Species.`Name`, InbredSet.`Name`, PublishXRef.`Id`
+ LIMIT 6000
+ """ % (self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms, self.terms)
+ re = g.db.execute(sql).fetchall()
+ self.trait_list = []
+ with Bench("Creating trait objects"):
+ for line in re:
+ dataset = create_dataset(line[2], "Publish")
+ trait_id = line[3]
+ this_trait = GeneralTrait(dataset=dataset, name=trait_id, get_qtl_info=True, get_sample_info=False)
+ self.trait_list.append(this_trait)
+
+ self.results = self.convert_to_json()
+
+ def convert_to_json(self):
+ json_dict = {}
+ #json_dict['draw'] = self.draw,
+ json_dict['recordsTotal'] = len(self.trait_list),
+ json_dict['data'] = []
+
+ for i, trait in enumerate(self.trait_list):
+ trait_row = { "checkbox": "<INPUT TYPE=\"checkbox\" NAME=\"searchResult\" class=\"checkbox trait_checkbox\" style=\"transform: scale(1.5);\" VALUE=\"{}:{}\">".format(trait.name, trait.dataset.name),
+ "index": i+1,
+ "species": trait.dataset.group.species,
+ "group": trait.dataset.group.name,
+ "tissue": trait.dataset.tissue,
+ "dataset": trait.dataset.fullname,
+ "record": "<a href=\"/show_trait?trait_id=" + trait.name + "&dataset=" + trait.dataset.name + "\" target=\"_blank\">" + trait.name + "</a>",
+ "symbol": trait.symbol,
+ "description": trait.description_display,
+ "location": trait.location_repr,
+ "mean": trait.mean,
+ "max_lrs": trait.LRS_score_repr,
+ "max_lrs_location": trait.LRS_location_repr,
+ "additive_effect": trait.additive}
+ json_dict['data'].append(trait_row)
+
+ json_results = json.dumps(json_dict)
+ return json_results
+
+
+
+
diff --git a/wqflask/wqflask/user_manager.py b/wqflask/wqflask/user_manager.py
index e16a397d..e334a9aa 100755
--- a/wqflask/wqflask/user_manager.py
+++ b/wqflask/wqflask/user_manager.py
@@ -12,6 +12,7 @@ import os
import hashlib
import datetime
import time
+import logging
import uuid
import hashlib
@@ -141,6 +142,9 @@ class UserSession(object):
"""Actual sqlalchemy record"""
# Only look it up once if needed, then store it
try:
+ logging.basicConfig()
+ logging.getLogger('sqlalchemy.pool').setLevel(logging.DEBUG)
+
# Already did this before
return self.db_object
except AttributeError:
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index 89b7ba43..df1f77bc 100755..100644
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -30,10 +30,11 @@ import sqlalchemy
from wqflask import app
from flask import (render_template, request, make_response, Response,
- Flask, g, config, jsonify, redirect, url_for)
+ Flask, g, config, jsonify, redirect, url_for, send_from_directory)
from wqflask import search_results
from wqflask import gsearch
+from wqflask import update_search_results
from wqflask import docs
from wqflask import news
from base.data_set import DataSet # Used by YAML in marker_regression
@@ -48,10 +49,13 @@ from wqflask.correlation_matrix import show_corr_matrix
from wqflask.correlation import corr_scatter_plot
from wqflask.wgcna import wgcna_analysis
+from wqflask.ctl import ctl_analysis
from utility import temp_data
+from utility.tools import TEMPDIR
from base import webqtlFormData
+from base.webqtlConfig import GENERATED_IMAGE_DIR
from utility.benchmark import Bench
from pprint import pformat as pf
@@ -96,7 +100,7 @@ def tmp_page(img_path):
print("img_path:", img_path)
initial_start_vars = request.form
print("initial_start_vars:", initial_start_vars)
- imgfile = open(webqtlConfig.TMPDIR + img_path, 'rb')
+ imgfile = open(GENERATED_IMAGE_DIR + img_path, 'rb')
imgdata = imgfile.read()
imgB64 = imgdata.encode("base64")
bytesarray = array.array('B', imgB64)
@@ -151,9 +155,7 @@ def search_page():
Redis.set(key, pickle.dumps(result, pickle.HIGHEST_PROTOCOL))
Redis.expire(key, 60*60)
- if result['quick']:
- return render_template("quick_search.html", **result)
- elif result['search_term_exists']:
+ if result['search_term_exists']:
return render_template("search_result_page.html", **result)
else:
return render_template("search_error.html")
@@ -166,12 +168,27 @@ def gsearchact():
return render_template("gsearch_gene.html", **result)
elif type == "phenotype":
return render_template("gsearch_pheno.html", **result)
+
+@app.route("/gsearch_updating", methods=('POST',))
+def gsearch_updating():
+ print("REQUEST ARGS:", request.values)
+ result = update_search_results.GSearch(request.args).__dict__
+ return result['results']
+ # type = request.args['type']
+ # if type == "gene":
+ # return render_template("gsearch_gene_updating.html", **result)
+ # elif type == "phenotype":
+ # return render_template("gsearch_pheno.html", **result)
@app.route("/docedit")
def docedit():
doc = docs.Docs(request.args['entry'])
return render_template("docedit.html", **doc.__dict__)
+@app.route('/generated/<filename>')
+def generated_file(filename):
+ return send_from_directory(GENERATED_IMAGE_DIR,filename)
+
@app.route("/help")
def help():
doc = docs.Docs("help")
@@ -190,6 +207,18 @@ def wcgna_results():
result = wgcna.process_results(wgcnaA) # After the analysis is finished store the result
return render_template("wgcna_results.html", **result) # Display them using the template
+@app.route("/ctl_setup", methods=('POST',))
+def ctl_setup():
+ print("In ctl, request.form is:", request.form) # We are going to get additional user input for the analysis
+ return render_template("ctl_setup.html", **request.form) # Display them using the template
+
+@app.route("/ctl_results", methods=('POST',))
+def ctl_results():
+ print("In ctl, request.form is:", request.form)
+ ctl = ctl_analysis.CTL() # Start R, load the package and pointers and create the analysis
+ ctlA = ctl.run_analysis(request.form) # Start the analysis, a ctlA object should be a separate long running thread
+ result = ctl.process_results(ctlA) # After the analysis is finished store the result
+ return render_template("ctl_results.html", **result) # Display them using the template
@app.route("/news")
def news_route():
@@ -236,13 +265,15 @@ def export_trait_excel():
for i, row in enumerate(sample_data):
worksheet.write(i, 0, row[0])
worksheet.write(i, 1, row[1])
+ if len(row) > 2:
+ worksheet.write(i, 2, row[2])
workbook.close()
excel_data = buff.getvalue()
buff.close()
return Response(excel_data,
mimetype='application/vnd.ms-excel',
- headers={"Content-Disposition":"attachment;filename=test.xlsx"})
+ headers={"Content-Disposition":"attachment;filename=sample_data.xlsx"})
@app.route('/export_trait_csv', methods=('POST',))
def export_trait_csv():
@@ -262,7 +293,30 @@ def export_trait_csv():
return Response(csv_data,
mimetype='text/csv',
- headers={"Content-Disposition":"attachment;filename=test.csv"})
+ headers={"Content-Disposition":"attachment;filename=sample_data.csv"})
+
+@app.route('/export_perm_data', methods=('POST',))
+def export_perm_data():
+ """CSV file consisting of the permutation data for the mapping results"""
+ num_perm = float(request.form['num_perm'])
+ perm_data = json.loads(request.form['perm_results'])
+
+ buff = StringIO.StringIO()
+ writer = csv.writer(buff)
+ writer.writerow(["Suggestive LRS (p=0.63) = " + str(perm_data[int(num_perm*0.37-1)])])
+ writer.writerow(["Significant LRS (p=0.05) = " + str(perm_data[int(num_perm*0.95-1)])])
+ writer.writerow(["Highly Significant LRS (p=0.01) = " + str(perm_data[int(num_perm*0.99-1)])])
+ writer.writerow("")
+ writer.writerow([str(num_perm) + " Permutations"])
+ writer.writerow("")
+ for item in perm_data:
+ writer.writerow([item])
+ csv_data = buff.getvalue()
+ buff.close()
+
+ return Response(csv_data,
+ mimetype='text/csv',
+ headers={"Content-Disposition":"attachment;filename=perm_data.csv"})
@app.route("/show_trait")
def show_trait_page():
@@ -339,17 +393,35 @@ def marker_regression_page():
'trait_id',
'dataset',
'method',
+ 'trimmed_markers',
'selected_chr',
+ 'chromosomes',
'mapping_scale',
'score_type',
'suggestive',
+ 'significant',
'num_perm',
+ 'permCheck',
+ 'perm_output',
+ 'num_bootstrap',
+ 'bootCheck',
+ 'bootstrap_results',
+ 'LRSCheck',
'maf',
'manhattan_plot',
'control_marker',
'control_marker_db',
'do_control',
'pair_scan',
+ 'startMb',
+ 'endMb',
+ 'graphWidth',
+ 'lrsMax',
+ 'additiveCheck',
+ 'showSNP',
+ 'showGenes',
+ 'viewLegend',
+ 'haplotypeAnalystCheck',
'mapmethod_rqtl_geno',
'mapmodel_rqtl_geno'
)
@@ -376,42 +448,56 @@ def marker_regression_page():
result = pickle.loads(result)
else:
print("Cache miss!!!")
- template_vars = marker_regression.MarkerRegression(start_vars, temp_uuid)
+ with Bench("Total time in MarkerRegression"):
+ template_vars = marker_regression.MarkerRegression(start_vars, temp_uuid)
template_vars.js_data = json.dumps(template_vars.js_data,
default=json_default_handler,
indent=" ")
result = template_vars.__dict__
- #print("initial result:", result['qtl_results'])
- #for item in template_vars.__dict__.keys():
- # print(" ---**--- {}: {}".format(type(template_vars.__dict__[item]), item))
-
- gn1_template_vars = marker_regression_gn1.MarkerRegression(result).__dict__
-
- #qtl_length = len(result['js_data']['qtl_results'])
- #print("qtl_length:", qtl_length)
- pickled_result = pickle.dumps(result, pickle.HIGHEST_PROTOCOL)
- print("pickled result length:", len(pickled_result))
- Redis.set(key, pickled_result)
- Redis.expire(key, 1*60)
-
- with Bench("Rendering template"):
- if result['pair_scan'] == True:
- img_path = result['pair_scan_filename']
- print("img_path:", img_path)
- initial_start_vars = request.form
- print("initial_start_vars:", initial_start_vars)
- imgfile = open('/home/zas1024/tmp/' + img_path, 'rb')
- imgdata = imgfile.read()
- imgB64 = imgdata.encode("base64")
- bytesarray = array.array('B', imgB64)
- result['pair_scan_array'] = bytesarray
- rendered_template = render_template("pair_scan_results.html", **result)
+ if result['pair_scan']:
+ with Bench("Rendering template"):
+ img_path = result['pair_scan_filename']
+ print("img_path:", img_path)
+ initial_start_vars = request.form
+ print("initial_start_vars:", initial_start_vars)
+ imgfile = open(TEMPDIR + img_path, 'rb')
+ imgdata = imgfile.read()
+ imgB64 = imgdata.encode("base64")
+ bytesarray = array.array('B', imgB64)
+ result['pair_scan_array'] = bytesarray
+ rendered_template = render_template("pair_scan_results.html", **result)
else:
- #rendered_template = render_template("marker_regression.html", **result)
- rendered_template = render_template("marker_regression_gn1.html", **gn1_template_vars)
+ #for item in template_vars.__dict__.keys():
+ # print(" ---**--- {}: {}".format(type(template_vars.__dict__[item]), item))
+
+ gn1_template_vars = marker_regression_gn1.MarkerRegression(result).__dict__
+
+ pickled_result = pickle.dumps(result, pickle.HIGHEST_PROTOCOL)
+ print("pickled result length:", len(pickled_result))
+ Redis.set(key, pickled_result)
+ Redis.expire(key, 1*60)
+
+ with Bench("Rendering template"):
+ rendered_template = render_template("marker_regression_gn1.html", **gn1_template_vars)
+
+ # with Bench("Rendering template"):
+ # if result['pair_scan'] == True:
+ # img_path = result['pair_scan_filename']
+ # print("img_path:", img_path)
+ # initial_start_vars = request.form
+ # print("initial_start_vars:", initial_start_vars)
+ # imgfile = open(TEMPDIR + '/' + img_path, 'rb')
+ # imgdata = imgfile.read()
+ # imgB64 = imgdata.encode("base64")
+ # bytesarray = array.array('B', imgB64)
+ # result['pair_scan_array'] = bytesarray
+ # rendered_template = render_template("pair_scan_results.html", **result)
+ # else:
+ # rendered_template = render_template("marker_regression.html", **result)
+ # rendered_template = render_template("marker_regression_gn1.html", **gn1_template_vars)
return rendered_template
@@ -432,7 +518,7 @@ def export_pdf():
svg_xml = request.form.get("data", "Invalid data")
print("svg_xml:", svg_xml)
filename = request.form.get("filename", "interval_map_pdf")
- filepath = "/home/zas1024/gene/wqflask/output/"+filename
+ filepath = GENERATED_IMAGE_DIR+filename
pdf_file = cairosvg.svg2pdf(bytestring=svg_xml)
response = Response(pdf_file, mimetype="application/pdf")
response.headers["Content-Disposition"] = "attachment; filename=%s"%filename
diff --git a/wqflask/wqflask/wgcna/wgcna_analysis.py b/wqflask/wqflask/wgcna/wgcna_analysis.py
index f23b1417..880a1cb2 100644
--- a/wqflask/wqflask/wgcna/wgcna_analysis.py
+++ b/wqflask/wqflask/wgcna/wgcna_analysis.py
@@ -6,7 +6,7 @@ import scipy as sp # SciPy
import rpy2.robjects as ro # R Objects
import rpy2.rinterface as ri
-from base import webqtlConfig # For paths and stuff
+from base.webqtlConfig import GENERATED_IMAGE_DIR
from utility import webqtlUtil # Random number for the image
import base64
@@ -86,8 +86,8 @@ class WGCNA(object):
trait = t[0] # R uses vectors every single element is a vector
for s in uStrainsR:
strain = s[0] # R uses vectors every single element is a vector
- rM.rx[strain, trait] = self.input[trait].get(strain) # Update the matrix location
#DEBUG: print(trait, strain, " in python: ", self.input[trait].get(strain), "in R:", rM.rx(strain,trait)[0])
+ rM.rx[strain, trait] = self.input[trait].get(strain) # Update the matrix location
sys.stdout.flush()
self.results = {}
@@ -127,8 +127,8 @@ class WGCNA(object):
# The iconic WCGNA plot of the modules in the hanging tree
self.results['imgurl'] = webqtlUtil.genRandStr("WGCNAoutput_") + ".png"
- self.results['imgloc'] = webqtlConfig.TMPDIR + self.results['imgurl']
- r_png(self.results['imgloc'], width=1000, height=600)
+ self.results['imgloc'] = GENERATED_IMAGE_DIR + self.results['imgurl']
+ r_png(self.results['imgloc'], width=1000, height=600, type='cairo-png')
mergedColors = self.r_labels2colors(network[1])
self.r_plotDendroAndColors(network[5][0], mergedColors, "Module colors", dendroLabels = False, hang = 0.03, addGuide = True, guideHang = 0.05)
r_dev_off()