diff --git a/modules/miscutil/lib/dateutils.py b/modules/miscutil/lib/dateutils.py index 8bf912cc3..7797bb531 100644 --- a/modules/miscutil/lib/dateutils.py +++ b/modules/miscutil/lib/dateutils.py @@ -1,282 +1,284 @@ # -*- coding: utf-8 -*- ## $Id$ ## ## Some functions about dates ## ## This file is part of CDS Invenio. ## Copyright (C) 2002, 2003, 2004, 2005, 2006 CERN. ## ## CDS Invenio is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2 of the ## License, or (at your option) any later version. ## ## CDS Invenio 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 ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with CDS Invenio; if not, write to the Free Software Foundation, Inc., ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. """ API for date conversion and date related GUI creation. Lexicon datetext: textual format => 'YEAR-MONTH-DAY HOUR:MINUTE:SECOND' e.g. '2005-11-16 15:11:44' default value: '0000-00-00 00:00:00' datestruct: tuple format => see http://docs.python.org/lib/module-time.html (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, WEEKDAY, YEARDAY, DAYLIGHT) e.g. (2005, 11, 16, 15, 11, 44, 2, 320, 0) default value: (0, 0, 0, 0, 0, 0, 0, 0, 0) dategui: textual format for output => 'DAY MONTH YEAR, HOUR:MINUTE' e.g. '16 nov 2005, 15:11' default value: _("N/A") """ __revision__ = "$Id$" from time import strptime, strftime, localtime import sre from invenio.config import cdslang from invenio.messages import gettext_set_language datetext_default = '0000-00-00 00:00:00' datestruct_default = (0, 0, 0, 0, 0, 0, 0, 0, 0) datetext_format = "%Y-%m-%d %H:%M:%S" def convert_datetext_to_dategui(datetext, ln=cdslang): """ Convert: '2005-11-16 15:11:57' => '16 nov 2005, 15:11' Month is internationalized """ try: datestruct = convert_datetext_to_datestruct(datetext) if datestruct == datestruct_default: raise ValueError month = get_i18n_month_name(datestruct[1], ln=ln) output_format = "%d " + month + " %Y, %H:%M" return strftime(output_format, datestruct) except: _ = gettext_set_language(ln) return _("N/A") def convert_datetext_to_datestruct(datetext): """ Convert: '2005-11-16 15:11:57' => (2005, 11, 16, 15, 11, 44, 2, 320, 0) """ try: return strptime(datetext, datetext_format) except: return datestruct_default def convert_datestruct_to_dategui(datestruct, ln=cdslang): """ Convert: (2005, 11, 16, 15, 11, 44, 2, 320, 0) => '16 nov 2005, 15:11' Month is internationalized """ try: if datestruct[0] and datestruct[1] and datestruct[2]: month = get_i18n_month_name(datestruct[1], ln=ln) output_format = "%d " + month + " %Y, %H:%M" return strftime(output_format, datestruct) else: raise ValueError except: _ = gettext_set_language(ln) return _("N/A") def convert_datestruct_to_datetext(datestruct): """ Convert: (2005, 11, 16, 15, 11, 44, 2, 320, 0) => '2005-11-16 15:11:57' """ try: return strftime(datetext_format, datestruct) except: return datetext_default def convert_datecvs_to_datestruct(datecvs): """ Convert CVS $Date$ format into datestruct. Useful for later conversion of Last updated timestamps in the page footers. Example: '$Date$' => (2006, 09, 20, 19, 27, 11, 0, 0) """ try: + # here we have to use '$' + 'Date...' here, otherwise the CVS + # commit would erase this time format to put commit date: return strptime(datecvs, '$' + 'Date: %Y/%m/%d %H:%M:%S' + '$') except ValueError: return datestruct_default def get_datetext(year, month, day): """ year=2005, month=11, day=16 => '2005-11-16 00:00:00' """ input_format = "%Y-%m-%d" try: datestruct = strptime("%i-%i-%i"% (year, month, day), input_format) return strftime(datetext_format, datestruct) except: return datetext_default def get_datestruct(year, month, day): """ year=2005, month=11, day=16 => (2005, 11, 16, 0, 0, 0, 2, 320, -1) """ input_format = "%Y-%m-%d" try: return strptime("%i-%i-%i"% (year, month, day), input_format) except ValueError or TypeError: return datestruct_default def get_i18n_day_name(day_nb, display='short', ln=cdslang): """ get the string representation of a weekday, internationalized @param day_nb: number of weekday UNIX like. => 0=Sunday @param ln: language for output @return the string representation of the day """ _ = gettext_set_language(ln) if display == 'short': days = {0: _("Sun"), 1: _("Mon"), 2: _("Tue"), 3: _("Wed"), 4: _("Thu"), 5: _("Fri"), 6: _("Sat")} else: days = {0: _("Sunday"), 1: _("Monday"), 2: _("Tuesday"), 3: _("Wednesday"), 4: _("Thursday"), 5: _("Friday"), 6: _("Saturday")} return days[day_nb] def get_i18n_month_name(month_nb, display='short', ln=cdslang): """ get a non-numeric representation of a month, internationalized. @param month_nb: number of month, (1 based!) =>1=jan,..,12=dec @param ln: language for output @return the string representation of month """ _ = gettext_set_language(ln) if display == 'short': monthes = {0: _("Month"), 1: _("Jan"), 2: _("Feb"), 3: _("Mar"), 4: _("Apr"), 5: _("May"), 6: _("Jun"), 7: _("Jul"), 8: _("Aug"), 9: _("Sep"), 10: _("Oct"), 11: _("Nov"), 12: _("Dec")} else: monthes = {0: _("Month"), 1: _("January"), 2: _("February"), 3: _("March"), 4: _("April"), 5: _("May"), 6: _("June"), 7: _("July"), 8: _("August"), 9: _("September"), 10: _("October"), 11: _("November"), 12: _("December")} return monthes[month_nb] def create_day_selectbox(name, selected_day=0, ln=cdslang): """ Creates an HTML menu for day selection. (0..31 values). @param name: name of the control (i.e. name of the var you'll get) @param selected_day: preselect a day. Use 0 for the label 'Day' @param ln: language of the menu @return html a string """ _ = gettext_set_language(ln) out = "<select name=\"%s\">\n"% name for i in range(0, 32): out += " <option value=\"%i\""% i if (i == selected_day): out += " selected=\"selected\"" if (i == 0): out += ">%s</option>\n"% _("Day") else: out += ">%i</option>\n"% i out += "</select>\n" return out def create_month_selectbox(name, selected_month=0, ln=cdslang): """ Creates an HTML menu for month selection. Value of selected field is numeric @param name: name of the control (your form will be sent with name=value...) @param selected_month: preselect a month. use 0 for the Label 'Month' @param ln: language of the menu @return html as string """ out = "<select name=\"%s\">\n"% name for i in range(0, 13): out += "<option value=\"%i\""% i if (i == selected_month): out += " selected=\"selected\"" out += ">%s</option>\n"% get_i18n_month_name(i, ln) out += "</select>\n" return out def create_year_inputbox(name, value=0): """ Creates an HTML field (simple input) for year selection. @param name: name of the control (i.e. name of the variable you'll get) @param value: prefilled value (int) @return html as string """ out = "<input type=\"text\" name=\"%s\" value=\"%i\" maxlength=\"4\" size=\"4\"/>\n"% (name, value) return out def create_year_selectbox(name, from_year=-1, length=10, selected_year=0, ln=cdslang): """ Creates an HTML menu (dropdownbox) for year selection. @param name: name of control( i.e. name of the variable you'll get) @param from_year: year on which to begin. if <0 assume it is current year @param length: number of items in menu @param selected_year: initial selected year (if in range), else: label is selected @param ln: language @return html as string """ _ = gettext_set_language(ln) if from_year < 0: from_year = localtime()[0] out = "<select name=\"%s\">\n"% name out += ' <option value="0"' if selected_year == 0: out += ' selected="selected"' out += ">%s</option>\n"% _("Year") for i in range(from_year, from_year + length): out += "<option value=\"%i\""% i if (i == selected_year): out += " selected=\"selected\"" out += ">%i</option>\n"% i out += "</select>\n" return out diff --git a/modules/miscutil/lib/dateutils_tests.py b/modules/miscutil/lib/dateutils_tests.py index 3780b4ebb..790c6887d 100644 --- a/modules/miscutil/lib/dateutils_tests.py +++ b/modules/miscutil/lib/dateutils_tests.py @@ -1,57 +1,61 @@ # -*- coding: utf-8 -*- ## ## $Id$ ## ## This file is part of CDS Invenio. ## Copyright (C) 2002, 2003, 2004, 2005, 2006 CERN. ## ## CDS Invenio is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2 of the ## License, or (at your option) any later version. ## ## CDS Invenio 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 ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with CDS Invenio; if not, write to the Free Software Foundation, Inc., ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. """Unit tests for dateutils library.""" __revision__ = "$Id$" import unittest import dateutils class ConvertDateCVSTest(unittest.TestCase): """ Testing conversion of CVS dates. """ def test_convert_good_cvsdate(self): """dateutils - conversion of good CVS dates""" + # here we have to use '$' + 'Date...' here, otherwise the CVS + # commit would erase this time format to put commit date: datecvs = "$" + "Date: 2006/09/21 10:07:22" + "$" datestruct_beginning_expected = (2006, 9, 21, 10, 7, 22) self.assertEqual(dateutils.convert_datecvs_to_datestruct(datecvs)[:6], datestruct_beginning_expected) def test_convert_bad_cvsdate(self): """dateutils - conversion of bad CVS dates""" + # here we have to use '$' + 'Date...' here, otherwise the CVS + # commit would erase this time format to put commit date: datecvs = "$" + "Date: 2006/AA/21 10:07:22" + "$" datestruct_beginning_expected = (0, 0, 0, 0, 0, 0) self.assertEqual(dateutils.convert_datecvs_to_datestruct(datecvs)[:6], datestruct_beginning_expected) def create_test_suite(): """ Return test suite for the dateutils. """ return unittest.TestSuite((unittest.makeSuite(\ ConvertDateCVSTest, 'test'), )) if __name__ == "__main__": unittest.TextTestRunner(verbosity=2).run(create_test_suite())