WebCal was having problems with female marriages even though they were divorced; still showing married. Web_Visually.css - was having problems with proper highlighting of navigation menus.
svn: r12355
This commit is contained in:
parent
e07febd145
commit
19df538d3e
@ -237,7 +237,8 @@ p#user_header {
|
|||||||
}
|
}
|
||||||
#navigation ul li a:hover, #subnavigation ul li a:hover {
|
#navigation ul li a:hover, #subnavigation ul li a:hover {
|
||||||
background-color:#C1B398;
|
background-color:#C1B398;
|
||||||
border-bottom:solid 1px #453619;
|
color:#000;
|
||||||
|
border-bottom:solid 1px #000;
|
||||||
}
|
}
|
||||||
#navigation ul li.CurrentSection a, #subnavigation ul li.CurrentSection a {
|
#navigation ul li.CurrentSection a, #subnavigation ul li.CurrentSection a {
|
||||||
font-weight:bold;
|
font-weight:bold;
|
||||||
|
@ -27,11 +27,6 @@
|
|||||||
Web Calendar generator.
|
Web Calendar generator.
|
||||||
|
|
||||||
Refactoring. This is an ongoing job until this plugin is in a better shape.
|
Refactoring. This is an ongoing job until this plugin is in a better shape.
|
||||||
TODO list:
|
|
||||||
- progress bar, rethink its usage
|
|
||||||
- in year navigation, use month in link, or 'fullyear'
|
|
||||||
- daylight saving not just for USA and Europe
|
|
||||||
- move the close_file() from one_day() to caller
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
@ -39,12 +34,8 @@ TODO list:
|
|||||||
# python modules
|
# python modules
|
||||||
#
|
#
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
import os
|
import os, codecs, shutil
|
||||||
import time
|
import time, datetime, calendar
|
||||||
import datetime
|
|
||||||
import calendar
|
|
||||||
import codecs
|
|
||||||
import shutil
|
|
||||||
from gettext import gettext as _
|
from gettext import gettext as _
|
||||||
from gettext import ngettext
|
from gettext import ngettext
|
||||||
|
|
||||||
@ -83,9 +74,19 @@ import libholiday
|
|||||||
# constants
|
# constants
|
||||||
#
|
#
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
|
# Calendar stylesheet names
|
||||||
|
_CALENDARSCREEN = 'calendar-screen.css'
|
||||||
|
_CALENDARPRINT = 'calendar-print.css'
|
||||||
|
|
||||||
|
# Mainz stylesheet graphics
|
||||||
|
# will only be used if Mainz is slected as the stylesheet
|
||||||
|
_WEBBKGD = "Web_Mainz_Bkgd.png"
|
||||||
|
_WEBHEADER = "Web_Mainz_Header.png"
|
||||||
|
_WEBMID = "Web_Mainz_Mid.png"
|
||||||
|
_WEBMIDLIGHT = "Web_Mainz_MidLight.png"
|
||||||
|
|
||||||
# This information defines the list of styles in the Web calendar
|
# This information defines the list of styles in the Web calendar
|
||||||
# options dialog as well as the location of the corresponding SCREEN
|
# options dialog as well as the location of the corresponding
|
||||||
# stylesheets.
|
# stylesheets.
|
||||||
_CSS_FILES = [
|
_CSS_FILES = [
|
||||||
# First is used as default selection.
|
# First is used as default selection.
|
||||||
@ -178,52 +179,43 @@ class WebCalReport(Report):
|
|||||||
"""
|
"""
|
||||||
def __init__(self, database, options):
|
def __init__(self, database, options):
|
||||||
Report.__init__(self, database, options)
|
Report.__init__(self, database, options)
|
||||||
menu = options.menu
|
mgobn = lambda name:options.menu.get_option_by_name(name).get_value()
|
||||||
|
|
||||||
self.database = database
|
self.database = database
|
||||||
self.options = options
|
self.options = options
|
||||||
|
|
||||||
self.html_dir = menu.get_option_by_name('target').get_value()
|
self.html_dir = mgobn('target')
|
||||||
self.title_text = menu.get_option_by_name('title').get_value()
|
self.title_text = mgobn('title')
|
||||||
filter_option = menu.get_option_by_name('filter')
|
filter_option = options.menu.get_option_by_name('filter')
|
||||||
self.filter = filter_option.get_filter()
|
self.filter = filter_option.get_filter()
|
||||||
self.ext = menu.get_option_by_name('ext').get_value()
|
self.ext = mgobn('ext')
|
||||||
self.copy = menu.get_option_by_name('cright').get_value()
|
self.copy = mgobn('cright')
|
||||||
self.encoding = menu.get_option_by_name('encoding').get_value()
|
self.encoding = mgobn('encoding')
|
||||||
self.css = menu.get_option_by_name('css').get_value()
|
self.css = mgobn('css')
|
||||||
|
|
||||||
self.country = menu.get_option_by_name('country').get_value()
|
self.country = mgobn('country')
|
||||||
self.start_dow = menu.get_option_by_name('start_dow').get_value()
|
self.start_dow = mgobn('start_dow')
|
||||||
|
|
||||||
self.multiyear = menu.get_option_by_name('multiyear').get_value()
|
self.multiyear = mgobn('multiyear')
|
||||||
|
|
||||||
self.start_year = menu.get_option_by_name('start_year').get_value()
|
self.start_year = mgobn('start_year')
|
||||||
self.end_year = menu.get_option_by_name('end_year').get_value()
|
self.end_year = mgobn('end_year')
|
||||||
|
|
||||||
self.fullyear = menu.get_option_by_name('fullyear').get_value()
|
self.fullyear = mgobn('fullyear')
|
||||||
|
|
||||||
self.maiden_name = menu.get_option_by_name('maiden_name').get_value()
|
self.maiden_name = mgobn('maiden_name')
|
||||||
|
|
||||||
self.alive = menu.get_option_by_name('alive').get_value()
|
self.alive = mgobn('alive')
|
||||||
self.birthday = menu.get_option_by_name('birthdays').get_value()
|
self.birthday = mgobn('birthdays')
|
||||||
self.anniv = menu.get_option_by_name('anniversaries').get_value()
|
self.anniv = mgobn('anniversaries')
|
||||||
self.home_link = menu.get_option_by_name('home_link').get_value().strip()
|
self.home_link = mgobn('home_link')
|
||||||
|
|
||||||
self.month_notes = [menu.get_option_by_name('note_jan').get_value(),
|
self.month_notes = [mgobn('note_' + month) \
|
||||||
menu.get_option_by_name('note_feb').get_value(),
|
for month in ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul',
|
||||||
menu.get_option_by_name('note_mar').get_value(),
|
'aug', 'sep', 'oct', 'nov', 'dec']]
|
||||||
menu.get_option_by_name('note_apr').get_value(),
|
|
||||||
menu.get_option_by_name('note_may').get_value(),
|
|
||||||
menu.get_option_by_name('note_jun').get_value(),
|
|
||||||
menu.get_option_by_name('note_jul').get_value(),
|
|
||||||
menu.get_option_by_name('note_aug').get_value(),
|
|
||||||
menu.get_option_by_name('note_sep').get_value(),
|
|
||||||
menu.get_option_by_name('note_oct').get_value(),
|
|
||||||
menu.get_option_by_name('note_nov').get_value(),
|
|
||||||
menu.get_option_by_name('note_dec').get_value()]
|
|
||||||
|
|
||||||
# identify researcher name and e-mail address
|
# identify researcher name and e-mail address
|
||||||
# as Narrated WebSite already does
|
# as NarrativeWeb already does
|
||||||
researcher = get_researcher()
|
researcher = get_researcher()
|
||||||
self.author = researcher.name
|
self.author = researcher.name
|
||||||
if self.author:
|
if self.author:
|
||||||
@ -330,28 +322,24 @@ class WebCalReport(Report):
|
|||||||
# Copy the screen stylesheet
|
# Copy the screen stylesheet
|
||||||
if self.css:
|
if self.css:
|
||||||
fname = os.path.join(const.DATA_DIR, self.css)
|
fname = os.path.join(const.DATA_DIR, self.css)
|
||||||
self.copy_file(fname, self.css, "styles")
|
self.copy_file(fname, _CALENDARSCREEN, "styles")
|
||||||
|
|
||||||
# copy print stylesheet
|
# copy print stylesheet
|
||||||
fname = os.path.join(const.DATA_DIR, "Web_Print-Default.css")
|
fname = os.path.join(const.DATA_DIR, "Web_Print-Default.css")
|
||||||
self.copy_file(fname, "Web_Print-Default.css", "styles")
|
self.copy_file(fname, _CALENDARPRINT, "styles")
|
||||||
|
|
||||||
# set imgs to empty
|
# set imgs to empty
|
||||||
imgs = []
|
imgs = []
|
||||||
|
|
||||||
if self.css == "Web_Mainz.css":
|
if self.css == "Web_Mainz.css":
|
||||||
# Copy Mainz Style Images
|
# Copy Mainz Style Images
|
||||||
imgs += ["Web_Mainz_Bkgd.png",
|
imgs += [_WEBBKGD, _WEBHEADER, _WEBMID, _WEBMIDLIGHT]
|
||||||
"Web_Mainz_Header.png",
|
|
||||||
"Web_Mainz_Mid.png",
|
|
||||||
"Web_Mainz_MidLight.png",
|
|
||||||
]
|
|
||||||
|
|
||||||
# Copy GRAMPS favicon
|
# Copy GRAMPS favicon
|
||||||
imgs += ['favicon.ico']
|
imgs += ['favicon.ico']
|
||||||
|
|
||||||
# copy copyright image
|
# copy copyright image
|
||||||
if 0 < self.copy < len(_CC):
|
if 0 < self.copy <= len(_CC):
|
||||||
imgs += ['somerights20.gif']
|
imgs += ['somerights20.gif']
|
||||||
|
|
||||||
for fname in imgs:
|
for fname in imgs:
|
||||||
@ -684,37 +672,35 @@ class WebCalReport(Report):
|
|||||||
|
|
||||||
of.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n')
|
of.write('<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n')
|
||||||
of.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ')
|
of.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ')
|
||||||
of.write('\t"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n')
|
of.write('"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n')
|
||||||
xmllang = Utils.xml_lang()
|
xmllang = Utils.xml_lang()
|
||||||
of.write('<html xmlns="http://www.w3.org/1999/xhtml" '
|
of.write('<html xmlns="http://www.w3.org/1999/xhtml" '
|
||||||
'xml:lang="%s" lang="%s">\n' % (xmllang, xmllang))
|
'xml:lang="%s" lang="%s">\n' % (xmllang, xmllang))
|
||||||
of.write('<head>\n')
|
of.write('<head>\n')
|
||||||
of.write('\t<title>%s</title>\n\n' % title)
|
of.write('\t<title>%s</title>\n' % title)
|
||||||
of.write('\t<meta http-equiv="Content-Type" content="text/html;charset=%s" />\n'
|
of.write('\t<meta http-equiv="Content-Type" content="text/html;charset=%s" />\n'
|
||||||
% self.encoding)
|
% self.encoding)
|
||||||
of.write('\t<meta name="generator" content="%s %s %s" />\n' %
|
of.write('\t<meta name="generator" content="%s %s %s" />\n' %
|
||||||
(const.PROGRAM_NAME, const.VERSION, const.URL_HOMEPAGE))
|
(const.PROGRAM_NAME, const.VERSION, const.URL_HOMEPAGE))
|
||||||
of.write('\t<meta name="author" content="%s" />\n\n' % self.author)
|
of.write('\t<meta name="author" content="%s" />\n' % self.author)
|
||||||
|
|
||||||
subdirs = ['..'] * nr_up
|
|
||||||
|
|
||||||
# link to screen stylesheet
|
# link to screen stylesheet
|
||||||
fname = '/'.join(subdirs + ['styles'] + [self.css])
|
fname = '../'*nr_up + 'styles/' + _CALENDARSCREEN
|
||||||
of.write('\t<link rel="stylesheet" href="%s" ' % fname)
|
of.write('\t<link rel="stylesheet" href="%s" ' % fname)
|
||||||
of.write('type="text/css" media="screen">\n')
|
of.write('type="text/css" media="screen" />\n')
|
||||||
|
|
||||||
# link to print stylesheet
|
# link to print stylesheet
|
||||||
if add_print:
|
if add_print:
|
||||||
fname = '/'.join(subdirs + ['styles'] + ["Web_Print-Default.css"])
|
fname = '../'*nr_up + 'styles/' + _CALENDARPRINT
|
||||||
of.write('\t<link rel="stylesheet" href="%s" ' % fname)
|
of.write('\t<link rel="stylesheet" href="%s" ' % fname)
|
||||||
of.write('type="text/css" media="print">\n')
|
of.write('type="text/css" media="print" />\n')
|
||||||
|
|
||||||
# link to GRAMPS favicon
|
# link to GRAMPS favicon
|
||||||
fname = '/'.join(subdirs + ['images'] + ['favicon.ico'])
|
fname = '../'*nr_up + 'images/' + 'favicon.ico'
|
||||||
of.write('\t<link rel="shortcut icon" href="%s" ' % fname)
|
of.write('\t<link rel="shortcut icon" href="%s" ' % fname)
|
||||||
of.write('type="image/icon" />\n')
|
of.write('type="image/icon" />\n')
|
||||||
|
|
||||||
of.write('</head>\n\n')
|
of.write('</head>\n')
|
||||||
|
|
||||||
def write_footer(self, of, nr_up):
|
def write_footer(self, of, nr_up):
|
||||||
"""
|
"""
|
||||||
@ -874,7 +860,7 @@ class WebCalReport(Report):
|
|||||||
of.write('<p id="description">%s</p></div>\n' % msg)
|
of.write('<p id="description">%s</p></div>\n' % msg)
|
||||||
|
|
||||||
# generate progress pass for "Year At A Glance"
|
# generate progress pass for "Year At A Glance"
|
||||||
self.progress.set_pass(_('Creating Year At A Glance calendars'), 12)
|
self.progress.set_pass(_('Creating Year At A Glance calendar'), 12)
|
||||||
|
|
||||||
for month in range(1, 13):
|
for month in range(1, 13):
|
||||||
|
|
||||||
@ -962,8 +948,7 @@ class WebCalReport(Report):
|
|||||||
# do some error correcting if needed
|
# do some error correcting if needed
|
||||||
if self.multiyear:
|
if self.multiyear:
|
||||||
if self.end_year < self.start_year:
|
if self.end_year < self.start_year:
|
||||||
# Huh? Why start_year+1?
|
self.end_year = self.start_year
|
||||||
self.end_year = self.start_year + 1
|
|
||||||
|
|
||||||
nr_up = 1 # Number of directory levels up to get to self.html_dir / root
|
nr_up = 1 # Number of directory levels up to get to self.html_dir / root
|
||||||
|
|
||||||
@ -1050,7 +1035,7 @@ class WebCalReport(Report):
|
|||||||
if mother_handle == person_handle:
|
if mother_handle == person_handle:
|
||||||
if father_handle:
|
if father_handle:
|
||||||
father = self.database.get_person_from_handle(father_handle)
|
father = self.database.get_person_from_handle(father_handle)
|
||||||
if father != None:
|
if father is not None:
|
||||||
father_name = father.primary_name
|
father_name = father.primary_name
|
||||||
father_surname = _get_regular_surname(sex, father_name)
|
father_surname = _get_regular_surname(sex, father_name)
|
||||||
short_name = _get_short_name(person, father_surname)
|
short_name = _get_short_name(person, father_surname)
|
||||||
@ -1075,11 +1060,9 @@ class WebCalReport(Report):
|
|||||||
spouse_name = _get_short_name(spouse)
|
spouse_name = _get_short_name(spouse)
|
||||||
short_name = _get_short_name(person)
|
short_name = _get_short_name(person)
|
||||||
|
|
||||||
are_married = get_marrital_status(self.database, fam)
|
marriage_event = get_marriage_event(self.database, fam)
|
||||||
if are_married is not None:
|
if marriage_event:
|
||||||
for event_ref in fam.get_event_ref_list():
|
event_obj = marriage_event.get_date_object()
|
||||||
event = self.database.get_event_from_handle(event_ref.ref)
|
|
||||||
event_obj = event.get_date_object()
|
|
||||||
year = event_obj.get_year()
|
year = event_obj.get_year()
|
||||||
month = event_obj.get_month()
|
month = event_obj.get_month()
|
||||||
day = event_obj.get_day()
|
day = event_obj.get_day()
|
||||||
@ -1212,7 +1195,7 @@ class WebCalOptions(MenuReportOptions):
|
|||||||
self.__multiyear_changed()
|
self.__multiyear_changed()
|
||||||
|
|
||||||
fullyear = BooleanOption(_('Create "Year At A Glance" '
|
fullyear = BooleanOption(_('Create "Year At A Glance" '
|
||||||
'Calendar(s)'), False)
|
'Calendar'), False)
|
||||||
fullyear.set_help(_('Whether to create A one-page mini calendar '
|
fullyear.set_help(_('Whether to create A one-page mini calendar '
|
||||||
'with dates highlighted'))
|
'with dates highlighted'))
|
||||||
menu.add_option(category_name, 'fullyear', fullyear)
|
menu.add_option(category_name, 'fullyear', fullyear)
|
||||||
@ -1352,7 +1335,7 @@ def _get_regular_surname(sex, name):
|
|||||||
Returns a name string built from the components of the Name instance.
|
Returns a name string built from the components of the Name instance.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
surname = name.surname
|
surname = name.get_surname()
|
||||||
prefix = name.get_surname_prefix()
|
prefix = name.get_surname_prefix()
|
||||||
if prefix:
|
if prefix:
|
||||||
surname = prefix + " " + surname
|
surname = prefix + " " + surname
|
||||||
@ -1366,9 +1349,10 @@ def _get_short_name(person, maiden_name=None):
|
|||||||
""" Return person's name, unless maiden_name given,
|
""" Return person's name, unless maiden_name given,
|
||||||
unless married_name listed. """
|
unless married_name listed. """
|
||||||
# Get all of a person's names:
|
# Get all of a person's names:
|
||||||
primary_name = person.get_primary_name()
|
primary_name = person.primary_name
|
||||||
sex = person.get_gender()
|
sex = person.gender
|
||||||
|
|
||||||
|
call_name = None
|
||||||
married_name = None
|
married_name = None
|
||||||
names = [primary_name] + person.get_alternate_names()
|
names = [primary_name] + person.get_alternate_names()
|
||||||
for name in names:
|
for name in names:
|
||||||
@ -1376,22 +1360,19 @@ def _get_short_name(person, maiden_name=None):
|
|||||||
married_name = name
|
married_name = name
|
||||||
|
|
||||||
# Now, decide which to use:
|
# Now, decide which to use:
|
||||||
if maiden_name is not None:
|
if maiden_name:
|
||||||
if married_name is not None:
|
if married_name:
|
||||||
first_name, family_name = married_name.get_first_name(), \
|
first_name, family_name = married_name.get_first_name(), _get_regular_surname(sex, married_name)
|
||||||
_get_regular_surname(sex, married_name)
|
|
||||||
call_name = married_name.get_call_name()
|
call_name = married_name.get_call_name()
|
||||||
else:
|
else:
|
||||||
first_name, family_name = primary_name.get_first_name(), \
|
first_name, family_name = primary_name.get_first_name(), maiden_name
|
||||||
maiden_name
|
|
||||||
call_name = primary_name.get_call_name()
|
call_name = primary_name.get_call_name()
|
||||||
else:
|
else:
|
||||||
first_name, family_name = primary_name.get_first_name(), \
|
first_name, family_name = primary_name.get_first_name(), _get_regular_surname(sex, primary_name)
|
||||||
_get_regular_surname(sex, primary_name)
|
|
||||||
call_name = primary_name.get_call_name()
|
call_name = primary_name.get_call_name()
|
||||||
|
|
||||||
# If they have a nickname use it
|
# If they have a nickname, use it?
|
||||||
if call_name is not None and call_name.strip() != "":
|
if call_name:
|
||||||
first_name = call_name.strip()
|
first_name = call_name.strip()
|
||||||
else: # else just get the first name:
|
else: # else just get the first name:
|
||||||
first_name = first_name.strip()
|
first_name = first_name.strip()
|
||||||
@ -1402,15 +1383,9 @@ def _get_short_name(person, maiden_name=None):
|
|||||||
|
|
||||||
# Simple utility list to convert Gramps day-of-week numbering
|
# Simple utility list to convert Gramps day-of-week numbering
|
||||||
# to calendar.firstweekday numbering
|
# to calendar.firstweekday numbering
|
||||||
dow_gramps2iso = [ -1,
|
dow_gramps2iso = [ -1, calendar.SUNDAY, calendar.MONDAY, calendar.TUESDAY,
|
||||||
calendar.SUNDAY,
|
calendar.WEDNESDAY, calendar.THURSDAY, calendar.FRIDAY,
|
||||||
calendar.MONDAY,
|
calendar.SATURDAY]
|
||||||
calendar.TUESDAY,
|
|
||||||
calendar.WEDNESDAY,
|
|
||||||
calendar.THURSDAY,
|
|
||||||
calendar.FRIDAY,
|
|
||||||
calendar.SATURDAY,
|
|
||||||
]
|
|
||||||
|
|
||||||
# define names for full and abbreviated month names in GrampsLocale
|
# define names for full and abbreviated month names in GrampsLocale
|
||||||
full_month_name = GrampsLocale.long_months
|
full_month_name = GrampsLocale.long_months
|
||||||
@ -1474,12 +1449,9 @@ def get_day_list(event_date, holiday_list, bday_anniv_list):
|
|||||||
# a birthday
|
# a birthday
|
||||||
if event == 'Birthday':
|
if event == 'Birthday':
|
||||||
|
|
||||||
if nyears == 0:
|
txt_str = _(text + ', <em>'
|
||||||
txt_str = _('%(person)s, <em>birth</em>') % {
|
+ ('%s old' % str(age_str) if nyears else 'birth')
|
||||||
'person' : text}
|
+ '</em>')
|
||||||
else:
|
|
||||||
txt_str = _('%(person)s, <em>%(age)s</em> old') % {
|
|
||||||
'person' : text, 'age' : age_str}
|
|
||||||
|
|
||||||
# an anniversary
|
# an anniversary
|
||||||
elif event == 'Anniversary':
|
elif event == 'Anniversary':
|
||||||
@ -1504,25 +1476,22 @@ def get_day_list(event_date, holiday_list, bday_anniv_list):
|
|||||||
|
|
||||||
return day_list
|
return day_list
|
||||||
|
|
||||||
def get_marrital_status(db, family):
|
def get_marriage_event(db, family):
|
||||||
"""
|
"""
|
||||||
Returns the marital status of two people, a couple
|
are_married will either be the marriage event or None
|
||||||
|
|
||||||
are_married will either be the marriage event
|
|
||||||
or None if not married anymore
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
are_married = None
|
marriage_event = False
|
||||||
for event_ref in family.get_event_ref_list():
|
for event_ref in family.get_event_ref_list():
|
||||||
event = db.get_event_from_handle(event_ref.ref)
|
event = db.get_event_from_handle(event_ref.ref)
|
||||||
if event.type in [gen.lib.EventType.MARRIAGE,
|
if event.type in [gen.lib.EventType.MARRIAGE,
|
||||||
gen.lib.EventType.MARR_ALT]:
|
gen.lib.EventType.MARR_ALT]:
|
||||||
are_married = event
|
marriage_event = event
|
||||||
elif event.type in [gen.lib.EventType.DIVORCE,
|
elif event.type in [gen.lib.EventType.DIVORCE,
|
||||||
gen.lib.EventType.ANNULMENT,
|
gen.lib.EventType.ANNULMENT,
|
||||||
gen.lib.EventType.DIV_FILING]:
|
gen.lib.EventType.DIV_FILING]:
|
||||||
are_married = None
|
marriage_event = False
|
||||||
return are_married
|
return marriage_event
|
||||||
|
|
||||||
def get_first_day_of_month(year, month):
|
def get_first_day_of_month(year, month):
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user