class ICalFile(FormatFile): _cal=None def __init__(self,name): filename=name+'.ics' super(ICalFile,self).__init__(filename) self._cal=Calendar() self._cal.add('prodid', '-//KPlato Export//athabascau.ca//') self._cal.add('version', '2.0') def add_appointment(self,uid,dtstart,dtend,dtstamp,summary,description): event=Event() event.add('summary',summary) event.add('description',description) event['uid']=uid # event.add('dtstart',dtstart) event['dtstart']=vDatetime(dtstart).ical() # event.add('dtend',dtend) event['dtend']=vDatetime(dtend).ical() # event.add('dtstamp',dtstamp) event['dtstamp']=vDatetime(dtstamp).ical() self._cal.add_component(event) def save(self): f=open(self.filename,'w') f.write(self._cal.as_string()) f.close()
def view_instance_calendar(request, course_url, instance_url): """ Renders a iCalendar feed for a CourseInstance. Unlike most other views in this module, this view does not require the user to be logged in. @param request: the Django HttpRequest object @param course_url: the url value of a Course object @param instance_url: the url value of a CourseInstance object """ course_instance = _get_course_instance(course_url, instance_url) cal = Calendar() cal.add('prodid', '-// A+ calendar //') cal.add('version', '2.0') for course_module in course_instance.course_modules.all(): event = Event() event.add('summary', course_module.name) # FIXME: Currently all times added are the closing time. # The event will need to be longer than 0 seconds in order # to be displayed clearly on calendar applications. event.add('dtstart', course_module.closing_time) event.add('dtend', course_module.closing_time) event.add('dtstamp', course_module.closing_time) event['uid'] = "module/" + str(course_module.id) + "/A+" cal.add_component(event) response = HttpResponse(cal.as_string(), content_type="text/calendar; charset=utf-8") return response
def export_ics(self): events = Event.get_recent_past_and_future() url_base = 'http://' + self.request.headers.get('host', 'events.hackerdojo.com') cal = Calendar() for event in events: iev = CalendarEvent() iev.add('summary', event.name if event.status == 'approved' else event.name + ' (%s)' % event.status.upper()) # make verbose description with empty fields where information is missing ev_desc = '__Status: %s\n__Member: %s\n__Type: %s\n__Estimated size: %s\n__Info URL: %s\n__Fee: %s\n__Contact: %s, %s\n__Rooms: %s\n\n__Details: %s\n\n__Notes: %s' % ( event.status, event.owner(), event.type, event.estimated_size, event.url, event.fee, event.contact_name, event.contact_phone, event.roomlist(), event.details, event.notes) # then delete the empty fields with a regex ev_desc = re.sub(re.compile(r'^__.*?:[ ,]*$\n*',re.M),'',ev_desc) ev_desc = re.sub(re.compile(r'^__',re.M),'',ev_desc) ev_url = url_base + event_path(event) iev.add('description', ev_desc + '\n--\n' + ev_url) iev.add('url', ev_url) if event.start_time: iev.add('dtstart', event.start_time.replace(tzinfo=pytz.timezone('US/Pacific'))) if event.end_time: iev.add('dtend', event.end_time.replace(tzinfo=pytz.timezone('US/Pacific'))) cal.add_component(iev) return 'text/calendar', cal.as_string()
def sk_forum_planning_calendar(request): from datetime import datetime, date from icalendar import Calendar, Event, UTC, LocalTimezone # timezone cal = Calendar() cal.add('prodid', '-//SK Forum Calendar//killingar.net//') cal.add('version', '2.0') import MySQLdb connection = MySQLdb.connect(user='******', passwd='2oVGx8VwuqUfY', db='forum') cursor = connection.cursor() from django.utils.encoding import smart_unicode cursor.execute(u'SELECT id FROM users where name = "%s"' % (smart_unicode(request.REQUEST['username']))) userID = cursor.fetchall()[0] cursor.execute("select id, name, time, description from events, eventdata where events.id = eventdata.event and events.visible = 1 and eventdata.user = %s and eventdata.data in (1, 0)" % userID) rows = cursor.fetchall() for row in rows: id, name, time, description = row event = Event() event.add('summary', smart_unicode(name.decode('latin-1'))) #event.add('dtstart', 'DATE:'+time.strftime("%Y%m%d")) #event.add('dtend', 'DATE:'+time.strftime("%Y%m%d")) event.add('dtstart', date(time.year, time.month, time.day)) event.add('dtend', date(time.year, time.month, time.day)) if description: event.add('description', smart_unicode(description.decode('latin-1'))) #event.add('X-FUNAMBOL-ALLDAY', '') event['uid'] = 'planning/%[email protected]' % id event.add('priority', 5) # normal priority cal.add_component(event) connection.close() return HttpResponse(cal.as_string(), content_type='text/calendar')
def XtestBla(self): from icalendar import Calendar c = Calendar() c['description']=u'Paragraph one\n\nParagraph two' output = c.as_string() self.assertEqual(output, "BEGIN:VCALENDAR\r\nDESCRIPTION:Paragraph one\r\n \r\n Paragraph two\r\nEND:VCALENDAR\r\n")
def ical(request, type='Full'): """ """ cal = Calendar() site = Site.objects.get_current() if type.lower() == 'full': gigs = g.objects.all() else: gigs = g.objects.filter(date__gte=datetime.now()) cal.add('prodid','-//{0} Events Calendar//{1}//EN'.format(type, site.domain)) cal.add('version','2.0') for gig in gigs: performances = p.objects.filter(gig=gig.id) for performance in performances: start = datetime.strptime('{0} {1}'.format(gig.date, performance.time), "%Y-%m-%d %H:%M:%S") end = start + timedelta(hours=2) ical_event = Event() ical_event.add('summary','{0}, {1}, {2}'.format(gig.venue.name, gig.venue.city, gig.venue.state)) ical_event.add('dtstart',start) ical_event.add('dtend',end) url = 'http://{0}{1}'.format(site.domain,gig.get_absolute_url()) ical_event.add('description',url) cal.add_component(ical_event) response = HttpResponse(cal.as_string(), mimetype='text/calendar') response['Filename'] = 'filename.ics' response['Content-Disposition'] = 'attachment; filename=filename.ics' return response
def new(self, cal, uri, event): if not cal: print "creating new calendar" cal = Calendar() cal['prodid'] = myProduct.prodid cal['version'] = myProduct.version if uri == "" or uri == None: import os uri = os.path.join(os.path.expanduser("~"), ".gdesklets", "gdesklets-calendar" + os.extsep + "ics") print "creating new file %s" % uri # Add the event to the calendar cal.add_component(event) try: tmp_cal_string = cal.as_string() except ValueError, error: print "ValueError in %s: \"%s\"\n" % (uri, error) print "This is a python issue, but could be solved in the icalendar package." print "Work around it by removing the offending dates in %s ." % uri return
def get(self, format): events = Event.all().filter("status IN", ["approved", "canceled"]).order("start_time") if format == "ics": cal = Calendar() for event in events: cal.add_component(event.to_ical()) self.response.headers["content-type"] = "text/calendar" self.response.out.write(cal.as_string()) elif format == "json": self.response.headers["content-type"] = "application/json" events = map(lambda x: x.to_dict(summarize=True), Event.get_approved_list()) self.response.out.write(simplejson.dumps(events)) elif format == "rss": url_base = "http://" + self.request.headers.get("host", "events.hackerdojo.com") rss = PyRSS2Gen.RSS2( title="Hacker Dojo Events Feed", link=url_base, description="Upcoming events at the Hacker Dojo in Mountain View, CA", lastBuildDate=datetime.now(), items=[ PyRSS2Gen.RSSItem( title=event.name, link=url_base + event_path(event), description=event.details, guid=url_base + event_path(event), pubDate=event.updated, ) for event in events ], ) self.response.headers["content-type"] = "application/xml" self.response.out.write(rss.to_xml())
def icalendar(native_languages, foreign_languages): calendar = calendar_for_languages( native_languages, foreign_languages) def full_names(langs): str = ", ".join([LANGUAGE_DICT(l) for l in langs[:-1]]) if len(langs) > 1: str = " or ".join(str, langs[-1]) return str cal = Calendar() calendar_description = \ ("Dates where we have at least {0} speakers of " "{1} learning {2} scheduled to be online at langolab.com.").format( NOTIFICATION_PARTNER_THRESHOLD, full_names(foreign_languages), full_names(native_languages)) cal.add('prodid', '-//Langolab//langolab.com//EN') cal.add("version", "2.0") cal.add("X-WR-CALNAME", "Langolab Language Pairings") cal.add("X-WR-CALDESC", calendar_description) cal_ranges = calendar.languagecalendarrange_set.filter( end_date__gte=utcnow()).order_by('start_date') for cal_range in cal_ranges: event = Event() event.add('summary', 'Partners online at langolab.com') event.add('dtstart', cal_range.start_date) event.add('dtend', cal_range.end_date + timedelta(hours=1)) event.add('dtstamp', utcnow()) event['uid'] = cal_range.uid cal.add_component(event) return cal.as_string()
def schedule_user_bookmarks(request, user_id, user_hash): user = get_object_or_404(User, id=user_id) auth_hash = hash_for_user(user) if user_hash != auth_hash: raise Http404() bookmarks = UserBookmark.objects.filter(user=user) cal = Calendar() cal.add("prodid", "-//PyCon 2011 Bookmarks//us.pycon.org//EN") cal.add("version", "2.0") cal.add("method", "REQUEST") cal.add("calscale", "GREGORIAN") cal.add("X-WR-CALNAME", "PyCon 2011 Bookmarks - %s" % user.username) cal.add("X-WR-TIMEZONE","US/Eastern") for bookmark in bookmarks: p = bookmark.presentation if p.slot is not None: event = Event() event.add("summary", p.title) event.add("dtstart", p.slot.start) event.add("dtend", p.slot.end) event.add("dtstamp", datetime.datetime.utcnow()) event.add("description", p.speaker.name + "\n\n" + p.description) event.add("location", p.slot.track) event["uid"] = str(p.pk) + "-2011.us.pycon.org" cal.add_component(event) response = HttpResponse(cal.as_string(), content_type="text/calendar") response["Content-Disposition"] = "filename=pycon2011-%s-bookmarks.ics" % user.username.encode("utf-8") return response
def emit( self, serialization ): try: from icalendar import Calendar, Event from icalendar import vText except ImportError: raise SerializationError( "iCalendar module could not be loaded." ) cal = Calendar() cal.add( 'prodid', '-//European Southern Observatory//Djangoplicity//EN' ) cal.add( 'version', '2.0' ) for e in serialization.data: event = Event() event.add( 'summary', smart_unicode( e['summary'] ) ) event.add( 'description', smart_unicode( e['description'] ) ) event.add( 'dtstart', e['dtstart'] ) event.add( 'dtend', e['dtend'] ) event.add( 'dtstamp', e['dtstamp'] ) if 'location' in e: event['location'] = vText( smart_unicode( e['location'] ) ) cal.add_component( event ) return cal.as_string()
def export(request, event_id): event = get_model('events', 'event').objects.get(id=event_id) cal = Calendar() site = Site.objects.get_current() cal.add('prodid', '-//%s Events Calendar//%s//' % (site.name, site.domain)) cal.add('version', '2.0') site_token = site.domain.split('.') site_token.reverse() site_token = '.'.join(site_token) ical_event = Event() ical_event.add('summary', event.description) ical_event.add('dtstart', event.start) ical_event.add('dtend', event.end and event.end or event.start) ical_event.add('dtstamp', event.end and event.end or event.start) ical_event['uid'] = '%d.event.events.%s' % (event.id, site_token) cal.add_component(ical_event) response = HttpResponse(cal.as_string(), mimetype="text/calendar") response[ 'Content-Disposition'] = 'attachment; filename=%s.ics' % event.slug return response
def get(self, format): events = Event.all().filter('status IN', ['approved', 'canceled']).order('start_time') if format == 'ics': cal = Calendar() for event in events: cal.add_component(event.to_ical()) self.response.headers['content-type'] = 'text/calendar' self.response.out.write(cal.as_string()) elif format == 'json': self.response.headers['content-type'] = 'application/json' events = map(lambda x: x.to_dict(summarize=True), Event.get_approved_list()) self.response.out.write(simplejson.dumps(events)) elif format =='rss': url_base = 'http://' + self.request.headers.get('host', 'events.hackerdojo.com') rss = PyRSS2Gen.RSS2( title = "Hacker Dojo Events Feed", link = url_base, description = "Upcoming events at the Hacker Dojo in Mountain View, CA", lastBuildDate = datetime.now(), items = [PyRSS2Gen.RSSItem( title = event.name, link = url_base + event_path(event), description = event.details, guid = url_base + event_path(event), pubDate = event.updated, ) for event in events] ) self.response.headers['content-type'] = 'application/xml' self.response.out.write(rss.to_xml())
def export (self): """Export to ical format""" start_date = datetime.date(2011, 10, 30) # first sunday of semester cal = Calendar() cal.add("prodid", "-//NHY//Technion Students' Schedule 1.0//EN") cal.add("version", 2.0) for (day_num, activities) in enumerate(self): for (activity_num, activity) in enumerate(activities): # date and time date = start_date + datetime.timedelta(day_num) time = datetime.time(*self.split_slot(activity.start)) dt_start = datetime.datetime.combine(date, time) time = datetime.time(*self.split_slot(activity.start + activity.length)) dt_end = datetime.datetime.combine(date, time) # add event to calendar file event = Event() event.add("summary", activity.text) event.add("dtstart", dt_start) event.add("dtend", dt_end) event.add("dtstamp", datetime.datetime.today()) event["uid"] = "NHY-TECHNION-STUDENTS-SCHEDULE-%d%d" % (day_num, activity_num) cal.add_component(event) f = open(os.path.expanduser("~/test.ics"), "w") f.write(get_display(cal.as_string())) #f.write((cal.as_string())) f.close()
def get(self, format): if format == 'ics': events = Event.all().filter('status IN', ['approved', 'canceled']).order('start_time') cal = Calendar() for event in events: cal.add_component(event.to_ical()) self.response.headers['content-type'] = 'text/calendar' self.response.out.write(cal.as_string())
def genAllEventsCalendar( cal_file ): cal = Calendar() cal.add('prodid', '-//calgen.py//xmpp.org//') cal.add('version', '2.0') for event in allevents: cal.add_component(event) f = open( cal_file , 'wb') f.write(cal.as_string()) f.close()
def render(self): viewer = INewsViewer(self.context, None) factory = getMultiAdapter((self.content, self.request), IEvent) cal = Calendar() cal.add('prodid', '-//Silva News Calendaring//lonely event//') cal.add('version', '2.0') for event in factory(viewer): cal.add_component(event) return cal.as_string()
def genAllEventsCalendar(cal_file): cal = Calendar() cal.add('prodid', '-//calgen.py//xmpp.org//') cal.add('version', '2.0') for event in allevents: cal.add_component(event) f = open(cal_file, 'wb') f.write(cal.as_string()) f.close()
def get(self, format): events = Event.all().filter('status IN', ['approved', 'canceled']).order('start_time') url_base = 'http://' + self.request.headers.get('host', 'events.hackerdojo.com') if format == 'json': self.response.headers['content-type'] = 'application/json' events = map(lambda x: x.to_dict(summarize=True), Event.get_approved_list()) self.response.out.write(simplejson.dumps(events)) elif format == 'ics': cal = Calendar() for event in events: iev = CalendarEvent() iev.add('summary', event.name if event.status == 'approved' else event.name + ' (%s)' % event.status.upper()) # make verbose description with empty fields where information is missing ev_desc = '__Status: %s\n__Member: %s\n__Type: %s\n__Estimated size: %s\n__Info URL: %s\n__Fee: %s\n__Contact: %s, %s\n__Rooms: %s\n\n__Details: %s\n\n__Notes: %s' % ( event.status, event.owner(), event.type, event.estimated_size, event.url, event.fee, event.contact_name, event.contact_phone, event.roomlist(), event.details, event.notes) # then delete the empty fields with a regex ev_desc = re.sub(re.compile(r'^__.*?:[ ,]*$\n*',re.M),'',ev_desc) ev_desc = re.sub(re.compile(r'^__',re.M),'',ev_desc) ev_url = url_base + event_path(event) iev.add('description', ev_desc + '\n--\n' + ev_url) iev.add('url', ev_url) if event.start_time: iev.add('dtstart', event.start_time.replace(tzinfo=pytz.timezone('US/Pacific'))) if event.end_time: iev.add('dtend', event.end_time.replace(tzinfo=pytz.timezone('US/Pacific'))) cal.add_component(iev) self.response.headers['content-type'] = 'text/calendar' self.response.out.write(cal.as_string()) elif format =='rss': url_base = 'http://' + self.request.headers.get('host', 'events.hackerdojo.com') rss = PyRSS2Gen.RSS2( title = "Hacker Dojo Events Feed", link = url_base, description = "Upcoming events at the Hacker Dojo in Mountain View, CA", lastBuildDate = datetime.now(), items = [PyRSS2Gen.RSSItem( title = event.name, link = url_base + event_path(event), description = event.details, guid = url_base + event_path(event), pubDate = event.updated, ) for event in events] ) self.response.headers['content-type'] = 'application/xml' self.response.out.write(rss.to_xml())
def user_ics(request, username, user_feed_hash): host = request.META['HTTP_HOST'] current_user, message = get_current_user(username) if message: return HttpResponseRedirect(reverse('home')) #user_events = Event.objects.all() if not user_feed_hash == current_user.user_feed_hash: return HttpResponseRedirect( reverse('euser_user_view', kwargs={'username': current_user.username})) user_events = Event.objects.filter( attendee__in=current_user.attendee_set.all()).order_by('-event_date') userical = Calendar() userical['summary'] = "Calendar for user %s" % (current_user.username) userical.add('prodid', '-//Evesch//NONSGML v1.0//EN') userical.add('version', '2.0') for event in user_events: cal_event = icalendar.Event() cal_event.add('summary', event.event_name) cal_event.add('dtstart', event.event_date) cal_event.add('description', event.event_desc) cal_event.add('categories', event.event_type) cal_event.add('duration', timedelta(hours=1)) cal_event.add( 'url', "http://" + host + reverse('event_event_view', kwargs={ 'org_short_name': event.event_org.org_short_name, 'event_hash': event.event_hash, })) if event.event_creator_name.email: organizer_n = event.event_creator_name.email else: organizer_n = "%s %s" % (event.event_creator_name.first_name, event.event_creator_name.last_name) organizer = vCalAddress('MAILTO:' + organizer_n) organizer.params['cn'] = vText("%s %s" % (event.event_creator_name.first_name, event.event_creator_name.last_name)) organizer.params['role'] = vText('CREATOR') cal_event.add('organizer', organizer, encode=0) userical.add_component(cal_event) template_name = "core/message.html" context = {} response = HttpResponse() response['Content-Type'] = 'text/calendar' response.write(userical.as_string()) #template_name = "error.html" return response
def to_ics(self): if not os.path.exists(self.storagedir): os.makedirs(self.storagedir) cal = Calendar() cal.add('version', '2.0') cal.add( 'prodid', '-//A.P.U Timetable Synchronizer by MavJS// http://goog.gl/9FRHL //' ) final_html = self.scrape() for row in final_html.findAll('tr')[1:]: event = Event() col = row.findAll('td') date = col[0].font.string time = col[1].font.string classroom = col[2].font.string location = col[3].font.string subject = col[4].font.string lecturer = col[5].font.string record = (date, time, classroom, location, subject, lecturer) line = "|".join(record) #this is lot of unesswary work i know but i like it this way feel free to edit parts = line.split('|') #trying to find the time times = parts[1].split(' - ') title = parts[4] where = parts[2] + "\t" + parts[3] content = parts[5] begin_str = "%s %s:00" % (parts[0][4:].strip(""), times[0]) end_str = "%s %s:00" % (parts[0][4:].strip(""), times[1]) now = datetime.now() now_time = now.strftime('%Y%m%dT%H%M%SZ') begin_time = datetime.strptime( begin_str, '%d-%b-%y %H:%M:%S').strftime('%Y%m%dT%H%M%SZ') end_time = datetime.strptime( end_str, '%d-%b-%y %H:%M:%S').strftime('%Y%m%dT%H%M%SZ') #start gathering info for VEVENT summary = title + " by " + content + " at " + where desc = title start = begin_time end = end_time stamp = now_time event.add('dtstart', start, encode=0) event.add('dtend', end, encode=0) event.add('transp', 'TRANSPARENT') event.add('summary', summary) event.add('description', desc) event['uid'] = hashlib.md5(desc).hexdigest() event.add('dtstamp', stamp, encode=0) cal.add_component(event) f = file(self.saveics, 'wb') f.write(cal.as_string()) f.close() return self.saveics
def genExtensionsCalendar(cal_file): cal = Calendar() cal.add('prodid', '-//calgen.py//xmpp.org//') cal.add('version', '2.0') files = glob.glob('extensions/xep-????.xml') files.sort(key=lambda x: x.lower()) for file in files: parseXEP(cal, file) f = open(cal_file, 'wb') f.write(cal.as_string()) f.close()
def genExtensionsCalendar( cal_file ): cal = Calendar() cal.add('prodid', '-//calgen.py//xmpp.org//') cal.add('version', '2.0') files = glob.glob('extensions/xep-????.xml') files.sort(key=lambda x: x.lower()) for file in files: parseXEP( cal, file) f = open( cal_file , 'wb') f.write(cal.as_string()) f.close()
def exportToICal(self, event_id): from pyamf.remoting.client import RemotingService # @UnresolvedImport from icalendar import Calendar, Event, vDatetime # @UnresolvedImport import uuid, os client = RemotingService(self.application.app_settings["url"]+"/"+self.application.app_config["connection"]["npi_service"]) service = client.getService("default") events = service.loadTable_amf(self.getCredentials(), "models.event", "id="+str(event_id), None) if events.__class__.__name__!="ArrayCollection": wx.MessageBox(str(events), "saveDataSet", wx.OK | wx.ICON_ERROR) return elif len(events)>0: event = events[0] cal = Calendar() cal.add('prodid', '-//nervatura.com/NONSGML Nervatura Calendar//EN') cal.add('version', '2.0') clevent = Event() if event["uid"]!=None: clevent['uid'] = event["uid"] else: clevent['uid'] = uuid.uuid4() if event["fromdate"]!=None: clevent['dtstart'] = vDatetime(event["fromdate"]).ical() if event["todate"]!=None: clevent['dtend'] = vDatetime(event["todate"]).ical() if event["subject"]!=None: clevent['summary'] = event["subject"] if event["place"]!=None: clevent['location'] = event["place"] if event["eventgroup"]!=None: groups = service.loadTable_amf(self.getCredentials(), "models.groups", "id="+str(event["eventgroup"]), None) if groups.__class__.__name__=="ArrayCollection": if len(groups)>0: clevent['category'] = groups[0].groupvalue if event["description"]!=None: clevent['description'] = event["description"] cal.add_component(clevent) wildcard = "iCal files (*.ical)|" \ "All files (*.*)|*.*" dlg = wx.FileDialog( self, message="Event export", defaultDir=(os.getenv('USERPROFILE') or os.getenv('HOME')), defaultFile=str(event["calnumber"]).replace("/", "_"), wildcard=wildcard, style=wx.SAVE) dlg.SetFilterIndex(0) if dlg.ShowModal() == wx.ID_OK: icalfile = open(dlg.GetPath()+".ical", 'w') icalfile.write(cal.as_string()) icalfile.close() dlg.Destroy()
def main(): """ Perform iCalendar to hCalendar rendering. """ html_dir = len(sys.argv) > 1 and sys.argv[1] or 'hcal' ics_fout = len(sys.argv) > 2 and open(sys.argv[2], 'w') or sys.stdout # Parse a directory of HTML files for hCalendar events. hp = HCalendarParser() events = [] for dirpath, dirnames, filenames in os.walk(html_dir): for fn in filenames: if fn.endswith(".html") or fn.endswith(".htm"): fp = os.path.join(dirpath, fn) data = open(fp, 'r').read() events.extend(hp.parse(data)) # Build a calendar from the parsed events and print the data cal = Calendar() for e in events: cal.add_component(e) print cal.as_string()
def main(): scr = SupercinemaRoveretoEventReader(True) events = scr.get_events() cal = Calendar() #cal.add('prodid', '-//My calendar product//mxm.dk//') cal.add('version', '2.0') for event in events: cal.add_component(event) f = open('scr.ics', 'wb') f.write(cal.as_string()) f.close()
def index(request, employee): trips = travelcal.Traveler.objects.get(traveler=employee).Trip() cal = Calendar() for trip in trips: ical_event = Event() ical_event.add('summary', '') ical_event.add('dtstart', '') ical_event.add('dtend', '') ical_event.add('dtstamp', '') cal.add_component(ical_event) response = HttpResponse(cal.as_string(), mimetype="text/calendar") response[ 'Content-Disposition'] = 'attachment; filename=%s.ics' % employee.slug return response
def genCalendarFromEventsFile( events_file, cal_file ): try: events = SimpleEvents( events_file ) cal = Calendar() cal.add('prodid', '-//calgen.py//xmpp.org//') cal.add('version', '2.0') day = timedelta(days=1) for ev in events.getEventList(): event = Event() if "date" in ev: ev["date"] = ev["date"].rstrip("Z") if "all-day" in ev: start = datetime.strptime(ev["date"], "%Y-%m-%d") # T%H:%M:%S event.add('dtstart', start.date()) event.add('dtend', (start + day).date()) event.add("dtstamp", (start + day).date()) else: start = datetime.strptime(ev["date"], "%Y-%m-%dT%H:%M:%S") start = start.replace(tzinfo=UTC) duration = timedelta(minutes=int(ev["duration"])) event.add('dtstart', start) event.add('dtend', (start + duration)) event.add("dtstamp", (start + duration)) if "alarm" in ev: alarm = Alarm() alarm_time = datetime.strptime(ev["date"], "%Y-%m-%dT%H:%M:%S") alarm_time = alarm_time.replace(tzinfo=UTC) alarm_time = alarm_time - timedelta(minutes=15) alarm.add("trigger", alarm_time) alarm.add("action", "display") event.add_component(alarm) if "summary" in ev: event.add('summary', ev["summary"]) if "description" in ev: event.add('description', ev["description"]) if "url" in ev: event.add('url', ev["url"]) cal.add_component(event) allevents.append(event) f = open( cal_file , 'wb') f.write(cal.as_string()) f.close() except: print "File not found! - " + events_file print "Unexpected error:", sys.exc_info()[0] traceback.print_exc(file=sys.stdout)
def genCalendarFromEventsFile(events_file, cal_file): try: events = SimpleEvents(events_file) cal = Calendar() cal.add('prodid', '-//calgen.py//xmpp.org//') cal.add('version', '2.0') day = timedelta(days=1) for ev in events.getEventList(): event = Event() if "date" in ev: ev["date"] = ev["date"].rstrip("Z") if "all-day" in ev: start = datetime.strptime(ev["date"], "%Y-%m-%d") # T%H:%M:%S event.add('dtstart', start.date()) event.add('dtend', (start + day).date()) event.add("dtstamp", (start + day).date()) else: start = datetime.strptime(ev["date"], "%Y-%m-%dT%H:%M:%S") start = start.replace(tzinfo=UTC) duration = timedelta(minutes=int(ev["duration"])) event.add('dtstart', start) event.add('dtend', (start + duration)) event.add("dtstamp", (start + duration)) if "alarm" in ev: alarm = Alarm() alarm_time = datetime.strptime(ev["date"], "%Y-%m-%dT%H:%M:%S") alarm_time = alarm_time.replace(tzinfo=UTC) alarm_time = alarm_time - timedelta(minutes=15) alarm.add("trigger", alarm_time) alarm.add("action", "display") event.add_component(alarm) if "summary" in ev: event.add('summary', ev["summary"]) if "description" in ev: event.add('description', ev["description"]) if "url" in ev: event.add('url', ev["url"]) cal.add_component(event) allevents.append(event) f = open(cal_file, 'wb') f.write(cal.as_string()) f.close() except: print "File not found! - " + events_file print "Unexpected error:", sys.exc_info()[0] traceback.print_exc(file=sys.stdout)
class Scheduler(): def __init__(self, ical_string, start_date, end_date, new_events): self.ical = Calendar.from_string(ical_string) self.simpl_ical = Calendar() self.new_events = new_events self.new_events.sort(key=lambda x: x.duration, reverse=True) self.start_date = start_date - start_date%30 + 30 self.end_date = end_date - end_date%30 + 30 def findSchedule(self): for event in self.new_events: is_scheduled = False curr_time = self.end_date - event.duration while not is_scheduled and not curr_time < self.start_date: event.start = curr_time event.end = curr_time + event.duration is_valid = True # check conflicts with current schedule for component in self.ical.walk(): if component.name == 'VEVENT': #try: dc = component.decoded dtstart = time.mktime(time.strptime(str(dc('dtstart')), '%Y-%m-%d %H:%M:%S+00:00'))/60 dtend = time.mktime(time.strptime(str(dc('dtend')), '%Y-%m-%d %H:%M:%S+00:00'))/60 if curr_time > dtstart and curr_time < dtend or curr_time + event.duration > dtstart and curr_time + event.duration < dtend or curr_time < dtstart and curr_time + event.duration > dtend or curr_time > dtstart and curr_time + event.duration < dtend or curr_time == dtstart or curr_time + event.duration == dtend: is_valid = False break if is_valid: for constraint in event.constraints: if not constraint.isValid(event, self.ical): is_valid = False break if is_valid: self.addToCalendar(event) is_scheduled = True else: curr_time -= 30 def addToCalendar(self, event): e = Event() e['summary'] = event.summary e['dtstart'] = datetime.fromtimestamp(event.start*60).strftime('%Y%m%dT%H%M%SZ') e['dtend'] = datetime.fromtimestamp(event.end*60).strftime('%Y%m%dT%H%M%SZ') e['details'] = event.details self.ical.add_component(e) self.simpl_ical.add_component(e) def writeFile(self): #return self.ical.as_string() return self.simpl_ical.as_string()
def to_ics(self): if not os.path.exists(self.storagedir): os.makedirs(self.storagedir) cal = Calendar() cal.add('version', '2.0') cal.add('prodid', '-//A.P.U Timetable Synchronizer by MavJS// http://goog.gl/9FRHL //') final_html = self.scrape() for row in final_html.findAll('tr')[1:]: event = Event() col = row.findAll('td') date = col[0].font.string time = col[1].font.string classroom = col[2].font.string location = col[3].font.string subject = col[4].font.string lecturer = col[5].font.string record = (date, time, classroom, location, subject, lecturer) line = "|".join(record) #this is lot of unesswary work i know but i like it this way feel free to edit parts = line.split('|') #trying to find the time times = parts[1].split(' - ') title = parts[4] where = parts[2] + "\t" + parts[3] content = parts[5] begin_str = "%s %s:00" % (parts[0][4:].strip(""), times[0]) end_str = "%s %s:00" % (parts[0][4:].strip(""), times[1]) now = datetime.now() now_time = now.strftime('%Y%m%dT%H%M%SZ') begin_time = datetime.strptime(begin_str, '%d-%b-%y %H:%M:%S').strftime('%Y%m%dT%H%M%SZ') end_time = datetime.strptime(end_str, '%d-%b-%y %H:%M:%S').strftime('%Y%m%dT%H%M%SZ') #start gathering info for VEVENT summary = title + " by " + content + " at " + where desc = title start = begin_time end = end_time stamp = now_time event.add('dtstart', start, encode=0) event.add('dtend', end, encode=0) event.add('transp', 'TRANSPARENT') event.add('summary', summary) event.add('description', desc) event['uid'] = hashlib.md5(desc).hexdigest() event.add('dtstamp', stamp, encode=0) cal.add_component(event) f = file(self.saveics, 'wb') f.write(cal.as_string()) f.close() return self.saveics
def orarender(beolvasott): cal = Calendar() cal.add("version", "2.0") cal.add("prodid", "-//Orarender//bergengocia.net//") cal["summary"] = beolvasott[0] cal["X-WR-CALNAME"] = beolvasott[0] print beolvasott[1] for ora in beolvasott[1]: cal.add_component(kurzusize(ora["nap"], idopontize(ora["ido"]), ora["hely"], ora["kurzus"])) # import tempfile, os # directory = tempfile.mkdtemp() # f = open('/home/gazs/Desktop/orarend.ics', 'wb') # f.write(cal.as_string()) # f.close() return cal.as_string(), beolvasott
def GenerateEvent(self, _event): cal = Calendar() cal.add('prodid', '-//My calendar product//mxm.dk//') cal.add('version', '2.0') event = Event() event.add('summary', _event['summary']) event.add('dtstart', datetime.strptime(_event['start']['date'], "%Y-%m-%d")) event.add('dtend', datetime.strptime(_event['end']['date'], "%Y-%m-%d")) event.add('priority', 1) cal.add_component(event) self.set_header ('Content-Type', 'text/calendar') self.set_header ('Content-Disposition', 'attachment; filename=myCalendar.ics') self.write(cal.as_string()) self.finish()
def delete(self, cal, uri, uid): for c in cal.walk('VCALENDAR'): new_cal = Calendar() new_cal['prodid'] = c.decoded('prodid', myProduct.prodid) new_cal['version'] = c.decoded('version', myProduct.version) # The old calendar's properties have to be added manually # since the Calendar() constructor seems to generate a # vCalendar already. # That, and without the following edit of cal.walk(), # new_cal would've given us a calendar within a calendar for k in c.keys(): new_cal.add(k, c[k]) # First we need to find an event in self.__cal with the # given uid # But not all components are vEvents and not all vEvents # necessarily have 'uid' (maybe) for component in [n for n in c.walk() if c.name != 'VCALENDAR']: try: if component.name == 'VEVENT' and component['uid'] == uid: # Delete this one (in other words, don't add it) print "Deleting %s" % component['summary'] else: new_cal.add_component(component) except: new_cal.add_component(component) # Maybe this isn't absolutely necessary # Maybe gamin file monitoring could be disabled during # this file write as well #TODO: investigate try: f = open(uri, 'wb') except: print "failed to open file %s" % uri return False else: try: f.write(new_cal.as_string()) except: print "failed to write calendar or failed to convert it to a string" return False else: f.close() return True
def render(self, request): data = self.construct() cal = Calendar() cal.add('prodid', 'iCalendar Feed') cal.add('version', '1.0') for newevent in data: ical_event = calEvent() ical_event.add('summary', newevent['description']) for occurrence in newevent['event_time']: ical_event.add('dtstart', occurrence['start_date']) ical_event.add('dtend', occurrence['end_date']) ical_event['uid'] = newevent['id'] cal.add_component(ical_event) return cal.as_string()
def journeys(request): new_events = [] if request.POST and 'plan' in request.POST: origin = request.session.pop('origin') events = request.session.pop('events') cal = Calendar() for i, event in enumerate(events): if request.POST.get('cb_%s' % str(i + 1)): ev = create_journey(origin, event) if ev: cal.add_component(ev) new_events.append({ 'departure': to_local(parse(str(ev['dtstart']))), 'arrival': to_local(parse(str(ev['dtend']))), 'name': ev['summary'] }) # if not empty if cal.subcomponents: if request.POST.get('email'): address = request.POST.get('email_address') evs = len(new_events) title = "%s events" % evs if evs >= 2 else new_events[0]['name'] generate_soap(address, cal, title) return HttpResponse('Email sent!') else: calfilename = 'calfile/meetit-%s.ics' % int(time.time()) calfile = os.path.join(settings.MEDIA_ROOT, calfilename) f = open(calfile, 'wb') f.write(cal.as_string()) f.close() else: cal_display = "no events!" return render_to_response('base_journeys.html', locals()) else: return HttpResponseRedirect('/')
def GenerateEvent(self, _event): cal = Calendar() cal.add('prodid', '-//My calendar product//mxm.dk//') cal.add('version', '2.0') event = Event() event.add('summary', _event['summary']) event.add('dtstart', datetime.strptime(_event['start']['date'], "%Y-%m-%d")) event.add('dtend', datetime.strptime(_event['end']['date'], "%Y-%m-%d")) event.add('priority', 1) cal.add_component(event) self.set_header('Content-Type', 'text/calendar') self.set_header('Content-Disposition', 'attachment; filename=myCalendar.ics') self.write(cal.as_string()) self.finish()
def user_ics(request,username,user_feed_hash): host = request.META['HTTP_HOST'] current_user, message = get_current_user(username) if message: return HttpResponseRedirect(reverse('home')) #user_events = Event.objects.all() if not user_feed_hash == current_user.user_feed_hash: return HttpResponseRedirect(reverse('euser_user_view', kwargs={'username':current_user.username})) user_events = Event.objects.filter(attendee__in=current_user.attendee_set.all()).order_by('-event_date') userical = Calendar() userical['summary'] = "Calendar for user %s" % (current_user.username) userical.add('prodid', '-//Evesch//NONSGML v1.0//EN') userical.add('version', '2.0') for event in user_events: cal_event = icalendar.Event() cal_event.add('summary', event.event_name) cal_event.add('dtstart', event.event_date) cal_event.add('description', event.event_desc) cal_event.add('categories',event.event_type) cal_event.add('duration',timedelta(hours=1)) cal_event.add('url',"http://" + host + reverse('event_event_view',kwargs={'org_short_name':event.event_org.org_short_name,'event_hash':event.event_hash,})) if event.event_creator_name.email: organizer_n = event.event_creator_name.email else: organizer_n = "%s %s" % (event.event_creator_name.first_name, event.event_creator_name.last_name) organizer = vCalAddress('MAILTO:' + organizer_n) organizer.params['cn'] = vText("%s %s" % (event.event_creator_name.first_name, event.event_creator_name.last_name)) organizer.params['role'] = vText('CREATOR') cal_event.add('organizer', organizer, encode=0) userical.add_component(cal_event) template_name = "core/message.html" context = {} response = HttpResponse() response['Content-Type'] = 'text/calendar' response.write(userical.as_string()) #template_name = "error.html" return response
def for_zip(request, location): url = BASE_WEATHER_URL % location dom = minidom.parse(urllib.urlopen(url)) forecasts = [] link = dom.getElementsByTagName('link') url = link[0].childNodes[0].data for node in dom.getElementsByTagNameNS(WEATHER_NS, 'forecast'): forecasts.append({ 'date': node.getAttribute('date'), 'low': node.getAttribute('low'), 'high': node.getAttribute('high'), 'condition_code': node.getAttribute('code'), 'condition': node.getAttribute('text') }) cal = Calendar() cal.add('prodid', '-//django-iweathercal//camronflanders.com//') cal.add('version', '2.0') for forecast in forecasts: parsed_date = re.search("(\d{2})\s(\w{3})\s(\d{4})", forecast['date']) day = int(parsed_date.group(1)) month = int(MONTHS_TO_NUM['%s' % parsed_date.group(2).upper()]) year = int(parsed_date.group(3)) startdate = date(year, month, day) enddate = date(year, month, day) + timedelta(1) e = Event() e.add('summary', u'%s %s, %s\u00B0/%s\u00B0' % (CONDITION_CODES[forecast['condition_code']], forecast['condition'], forecast['high'], forecast['low'])) e.add('dtstart', startdate) e.add('dtend', enddate) e.add('dtstamp', datetime.now()) e.add('url', url) cal.add_component(e) response = HttpResponse(mimetype="text/calendar") response.write(cal.as_string()) return response
def ausgabe_ics(self, dn): print "Ausgabe von ", dn cal = Calendar() cal.add("prodid", "-//wnfDesktopKalender//wlsoft.de//") cal.add("version", "2.0") event = Event() event.add("summary", "Python meeting about calendaring") event.add("dtstart", wnf_tools.strToDate("03.04.2009")) event.add("dtend", wnf_tools.strToDate("03.04.2009")) event.add("dtstamp", wnf_tools.strToDate("03.04.2009")) event["uid"] = "20050115T101010/[email protected]" event.add("priority", 5) cal.add_component(event) f = open(dn, "wb") f.write(cal.as_string()) f.close()
def schedule_user_bookmarks(request, user_id, user_hash): user = get_object_or_404(User, id=user_id) auth_hash = hash_for_user(user) if user_hash != auth_hash: raise Http404() bookmarks = UserBookmark.objects.filter(user=user) cal = Calendar() cal.add("prodid", "-//PyCon 2011 Bookmarks//us.pycon.org//EN") cal.add("version", "2.0") cal.add("method", "REQUEST") cal.add("calscale", "GREGORIAN") cal.add("X-WR-CALNAME", "PyCon 2011 Bookmarks - %s" % user.username) cal.add("X-WR-TIMEZONE", "US/Eastern") for bookmark in bookmarks: p = bookmark.presentation if p.slot is not None: event = Event() event.add("summary", p.title) event.add("dtstart", p.slot.start) event.add("dtend", p.slot.end) event.add("dtstamp", datetime.datetime.utcnow()) event.add("description", p.speaker.name + "\n\n" + p.description) event.add("location", p.slot.track) event["uid"] = str(p.pk) + "-2011.us.pycon.org" cal.add_component(event) response = HttpResponse(cal.as_string(), content_type="text/calendar") response[ "Content-Disposition"] = "filename=pycon2011-%s-bookmarks.ics" % user.username.encode( "utf-8") return response
DATE_FORMAT = "%a, %d %b %Y %H:%M:%S GMT" feed = feedparser.parse("http://www.co.frederick.va.us/fredcocal.xml") cal = Calendar() cal.add('VERSION', '2.0') cal.add('PRODID', 'feed2ical 0.1') cal.add('X-WR-CALNAME;VALUE=TEXT', feed.channel.title) cal.add('X-WR-CALDESC;VALUE=TEXT', feed.channel.description) for item in feed['items']: event_date = datetime.strptime(item.caldate, DATE_FORMAT).replace(tzinfo=LocalTimezone()) published_date = datetime.strptime( item.updated, DATE_FORMAT).replace(tzinfo=LocalTimezone()) event = Event() event.add('UID', item.guid) event.add('SUMMARY', item.title) event.add('DESCRIPTION', item.description) event.add('URL;VALUE=URI', item.link) event.add('DTSTART', event_date.date()) event.add('DTEND', event_date.date()) event.add('DTSTAMP', published_date) cal.add_component(event) sys.stdout.write(cal.as_string())
def process_item(self, item, spider): cal = Calendar() cal.add('calscale', 'GREGORIAN') cal.add('version', '2.0') cal['method'] = 'PUBLISH' if item['exam'] != 'null': exam = Event() exam.add('summary', '%s exam %s' % (item['code'], item['exam']['time'])) starttime = datetime.combine( item['exam']['date'], time() if item['exam']['time'] == 'AM' else time( 12, 0)).replace(tzinfo=SGT()) setstartend(exam, starttime, starttime + 12 * hour) cal.add_component(exam) if item['lecture_time_table'] != 'null': for l in item['lecture_time_table']: for lec in l['sessions']: dow = lec['day'] ts = int(lec['starttime']) te = int(lec['endtime']) ts_hr, ts_min = ts / 100, ts % 100 te_hr, te_min = te / 100, te % 100 combstr = ','.join([ str(WEEK2ACTUAL[i - 1] + startweek - 1) for i in lec['occurence'] ]) lectureday = SEM_START + (dow - 1) * day lecture = Event() lecture.add('summary', '%s %s' % (item['code'], l['name'])) setstartend(lecture, lectureday + ts_hr * hour + ts_min * minute, lectureday + te_hr * hour + te_min * minute) lecture['rrule'] = 'FREQ=YEARLY;BYWEEKNO=%s;BYDAY=%s' % ( combstr, WEEKDAY[lec['day'] - 1]) lecture['location'] = lec['location'] cal.add_component(lecture) if item['tutorial_time_table'] != 'null': for t in item['tutorial_time_table']: for tut in t['sessions']: dow = tut['day'] ts = int(tut['starttime']) te = int(tut['endtime']) ts_hr, ts_min = ts / 100, ts % 100 te_hr, te_min = te / 100, te % 100 combstr = ','.join([ str(WEEK2ACTUAL[i - 1] + startweek - 1) for i in tut['occurence'] if i != 1 ]) #precautionary check tutday = SEM_START + (dow - 1) * day + ( WEEK2ACTUAL[ (tut['occurence'][0] if tut['occurence'][0] != 1 else tut['occurence'][1]) - 1 #another stupid check, tutorials really shouldn't start on 1st week. ] - 1) * week tutorial = Event() tutorial.add('summary', '%s %s' % (item['code'], t['name'])) setstartend(tutorial, tutday + ts_hr * hour + ts_min * minute, tutday + te_hr * hour + te_min * minute) tutorial['rrule'] = 'FREQ=YEARLY;BYWEEKNO=%s;BYDAY=%s' % ( combstr, WEEKDAY[tut['day'] - 1]) tutorial['location'] = tut['location'] cal.add_component(tutorial) f = open(os.path.join('ics', ('%s.ics' % item['code'].split()[0])), 'wb') f.write(cal.as_string()) f.close() return item
# generate importance filter string imp_list = [] for i in xrange(imp, 3): imp_list.append("%d" % i) imp_filter = "(" + ",".join(imp_list) + ")" q = db.GqlQuery( "select * from News_Record_v2 where when > :1 and when < :2 and importance in %s order by when" % imp_filter, d_from, d_to) id = 0 for ev in q: if not check_filter(curr_filter, ev.curr): continue event = Event() event['uid'] = "*****@*****.**" % ( id, time.mktime(ev.when.timetuple())) event['summary'] = vText(u"%s, Imp: %s" % (norm_str(ev.title), news.val2imp(ev.importance))) event['description'] = vText("Prev: %s\\, Fore: %s" % (norm_str(ev.pred), norm_str(ev.fore))) event['dtstamp'] = ev.when.strftime("%Y%m%dT%H%M%SZ") event['dtstart'] = ev.when.strftime("%Y%m%dT%H%M%SZ") event['dtend'] = ( ev.when + datetime.timedelta(minutes=10)).strftime("%Y%m%dT%H%M%SZ") event['priority'] = 0 cal.add_component(event) id += 1 print cal.as_string(),
def main(): city_name = sys.argv[1] latitude = sexastr2deci(sys.argv[2]) longitude = sexastr2deci(sys.argv[3]) tz = sys.argv[4] start_year = int(sys.argv[5]) year = start_year jd = swisseph.julday(year, 1, 1, 0) jd_start = jd if len(sys.argv) == 7: script = sys.argv[6] else: script = 'deva' #Default script is devanagari swisseph.set_sid_mode(swisseph.SIDM_LAHIRI) #Force Lahiri Ayanamsha sun_month_day = jd - get_last_dhanur_transit(jd, latitude, longitude) month_start_after_set = 0 template_file = open('cal_template_compre.tex') template_lines = template_file.readlines() for i in range(0, len(template_lines) - 3): print template_lines[i][:-1] samvatsara_id = (year - 1568) % 60 + 1 #distance from prabhava samvatsara_names = '%s–%s' % (year_names[script][samvatsara_id], year_names[script][(samvatsara_id % 60) + 1]) new_yr = mesha_sankranti[script] + '~(' + year_names[script][ (samvatsara_id % 60) + 1] + '-' + samvatsara[script] + ')' print '\\mbox{}' print '{\\font\\x="Candara" at 60 pt\\x %d\\\\[0.5cm]}' % year print '\\mbox{\\font\\x="Sanskrit 2003:script=deva" at 48 pt\\x %s}\\\\[0.5cm]' % samvatsara_names print '{\\font\\x="Candara" at 48 pt\\x \\uppercase{%s}\\\\[0.5cm]}' % city_name print '\hrule' #INITIALISE VARIABLES jd_sunrise = [None] * 368 jd_sunset = [None] * 368 jd_moonrise = [None] * 368 longitude_moon = [None] * 368 longitude_sun = [None] * 368 longitude_sun_set = [None] * 368 sun_month_id = [None] * 368 sun_month = [None] * 368 sun_month_rise = [None] * 368 moon_month = [None] * 368 month_data = [None] * 368 tithi_data_string = [None] * 368 tithi_sunrise = [None] * 368 nakshatram_data_string = [None] * 368 nakshatram_sunrise = [None] * 368 karanam_data_string = [None] * 368 karanam_sunrise = [None] * 368 yogam_data_string = [None] * 368 yogam_sunrise = [None] * 368 weekday = [None] * 368 sunrise = [None] * 368 sunset = [None] * 368 madhya = [None] * 368 rahu = [None] * 368 yama = [None] * 368 festival_day_list = {} festivals = [''] * 368 weekday_start = swisseph.day_of_week(jd) + 1 #swisseph has Mon = 0, non-intuitively! ################################################## #Compute all parameters -- latitude/longitude etc# ################################################## for d in range(-1, 367): jd = jd_start - 1 + d [y, m, dt, t] = swisseph.revjul(jd) weekday = (weekday_start - 1 + d) % 7 local_time = pytz.timezone(tz).localize(datetime(y, m, dt, 6, 0, 0)) #checking @ 6am local - can we do any better? tz_off = datetime.utcoffset(local_time).seconds / 3600.0 #compute offset from UTC jd_sunrise[d + 1] = swisseph.rise_trans( jd_start=jd + 1, body=swisseph.SUN, lon=longitude, lat=latitude, rsmi=swisseph.CALC_RISE | swisseph.BIT_DISC_CENTER)[1][0] jd_sunset[d + 1] = swisseph.rise_trans( jd_start=jd + 1, body=swisseph.SUN, lon=longitude, lat=latitude, rsmi=swisseph.CALC_SET | swisseph.BIT_DISC_CENTER)[1][0] jd_moonrise[d + 1] = swisseph.rise_trans( jd_start=jd + 1, body=swisseph.MOON, lon=longitude, lat=latitude, rsmi=swisseph.CALC_RISE | swisseph.BIT_DISC_CENTER)[1][0] longitude_sun[d + 1] = swisseph.calc_ut( jd_sunrise[d + 1], swisseph.SUN)[0] - swisseph.get_ayanamsa( jd_sunrise[d + 1]) longitude_moon[d + 1] = swisseph.calc_ut( jd_sunrise[d + 1], swisseph.MOON)[0] - swisseph.get_ayanamsa( jd_sunrise[d + 1]) longitude_sun_set[d + 1] = swisseph.calc_ut( jd_sunset[d + 1], swisseph.SUN)[0] - swisseph.get_ayanamsa( jd_sunset[d + 1]) sun_month_id[d + 1] = int(1 + math.floor(( (longitude_sun_set[d + 1]) % 360) / 30.0)) sun_month[d + 1] = int(1 + math.floor(( (longitude_sun_set[d + 1]) % 360) / 30.0)) sun_month_rise[d + 1] = int(1 + math.floor(( (longitude_sun[d + 1]) % 360) / 30.0)) if (d <= 0): continue t_sunrise = (jd_sunrise[d] - jd) * 24.0 + tz_off t_sunset = (jd_sunset[d] - jd) * 24.0 + tz_off #Solar month calculations if month_start_after_set == 1: sun_month_day = 0 month_start_after_set = 0 if sun_month[d] != sun_month[d + 1]: sun_month_day = sun_month_day + 1 if sun_month[d] != sun_month_rise[d + 1]: month_start_after_set = 1 [_m, sun_month_end_time] = get_angam_data_string( masa_names[script], 30, jd_sunrise[d], jd_sunrise[d + 1], t_sunrise, longitude_moon[d], longitude_sun[d], longitude_moon[d + 1], longitude_sun[d + 1], [0, 1], script) elif sun_month_rise[d] != sun_month[d]: #mAsa pirappu! #sun moves into next rAsi before sunset -- check rules! sun_month_day = 1 [_m, sun_month_end_time] = get_angam_data_string( masa_names[script], 30, jd_sunrise[d], jd_sunrise[d + 1], t_sunrise, longitude_moon[d], longitude_sun[d], longitude_moon[d + 1], longitude_sun[d + 1], [0, 1], script) else: sun_month_day = sun_month_day + 1 sun_month_end_time = '' month_data[d] = '\\sunmonth{%s}{%d}{%s}' % (masa_names[script][ sun_month[d]], sun_month_day, sun_month_end_time) #KARADAYAN NOMBU -- easy to check here if sun_month_end_time != '': #month ends today if (sun_month[d] == 12 and sun_month_day == 1) or (sun_month[d] == 11 and sun_month_day != 1): festival_day_list[karadayan_nombu[script]] = [d] #Sunrise/sunset and related stuff (like rahu, yama) [rhs, rms, rss] = deci2sexa( t_sunrise) #rise hour sun, rise minute sun, rise sec sun [shs, sms, sss] = deci2sexa(t_sunset) length_of_day = t_sunset - t_sunrise yamagandam_start = t_sunrise + (1 / 8.0) * ( yamagandam_octets[weekday] - 1) * length_of_day yamagandam_end = yamagandam_start + (1 / 8.0) * length_of_day rahukalam_start = t_sunrise + (1 / 8.0) * (rahukalam_octets[weekday] - 1) * length_of_day rahukalam_end = rahukalam_start + (1 / 8.0) * length_of_day madhyahnikam_start = t_sunrise + (1 / 5.0) * length_of_day sunrise[d] = '%02d:%02d' % (rhs, rms) sunset[d] = '%02d:%02d' % (shs, sms) madhya[d] = print_time(madhyahnikam_start) rahu[d] = '%s--%s' % (print_time(rahukalam_start), print_time(rahukalam_end)) yama[d] = '%s--%s' % (print_time(yamagandam_start), print_time(yamagandam_end)) [tithi_sunrise[d], tithi_data_string[d]] = get_angam_data_string( tithi_names[script], 12, jd_sunrise[d], jd_sunrise[d + 1], t_sunrise, longitude_moon[d], longitude_sun[d], longitude_moon[d + 1], longitude_sun[d + 1], [1, -1], script) [nakshatram_sunrise[d], nakshatram_data_string[d]] = get_angam_data_string( nakshatra_names[script], (360.0 / 27.0), jd_sunrise[d], jd_sunrise[d + 1], t_sunrise, longitude_moon[d], longitude_sun[d], longitude_moon[d + 1], longitude_sun[d + 1], [1, 0], script) [karanam_sunrise[d], karanam_data_string[d]] = get_angam_data_string( karanam_names[script], 6, jd_sunrise[d], jd_sunrise[d + 1], t_sunrise, longitude_moon[d], longitude_sun[d], longitude_moon[d + 1], longitude_sun[d + 1], [1, -1], script) [yogam_sunrise[d], yogam_data_string[d]] = get_angam_data_string( yogam_names[script], (360.0 / 27.0), jd_sunrise[d], jd_sunrise[d + 1], t_sunrise, longitude_moon[d], longitude_sun[d], longitude_moon[d + 1], longitude_sun[d + 1], [1, 1], script) #ASSIGN MOON MONTHS last_month_change = 1 last_moon_month = None for d in range(1, 367): #Assign moon_month for each day if (tithi_sunrise[d] == 1): for i in range(last_month_change, d): #print '%%#Setting moon_month to sun_month_id, for i=%d:%d to %d' %(last_month_change,d-1,sun_month_id[d]) if (sun_month_id[d] == last_moon_month): moon_month[i] = sun_month_id[d] % 12 + 0.5 else: moon_month[i] = sun_month_id[d] last_month_change = d last_moon_month = sun_month_id[d] elif (tithi_sunrise[d] == 2 and tithi_sunrise[d - 1] == 30): #prathama tithi was never seen @ sunrise for i in range(last_month_change, d): #print '%%@Setting moon_month to sun_month_id, for i=%d:%d to %d (last month = %d)' %(last_month_change,d-1,sun_month_id[d],last_moon_month) if (sun_month_id[d - 1] == last_moon_month): moon_month[i] = sun_month_id[d - 1] % 12 + 0.5 else: moon_month[i] = sun_month_id[d - 1] last_month_change = d last_moon_month = sun_month_id[d - 1] for i in range(last_month_change, 367): moon_month[i] = sun_month_id[last_month_change - 1] + 1 #for d in range(1,367): #jd = jd_start-1+d #[y,m,dt,t] = swisseph.revjul(jd) #print '%%#%02d-%02d-%4d: %3d:%s (sunrise tithi=%d) {%s}' % (dt,m,y,d,moon_month[d],tithi_sunrise[d],tithi_data_string[d]) log_file = open('cal_log_%4d.txt' % year, 'w') for d in range(1, 367): jd = jd_start - 1 + d [y, m, dt, t] = swisseph.revjul(jd) log_data = '%02d-%02d-%4d\t[%3d]\tsun_rashi=%8.3f\ttithi=%8.3f\tsun_month=%2d\tmoon_month=%4.1f\n' % ( dt, m, y, d, (longitude_sun_set[d] % 360) / 30.0, get_angam_float(jd_sunrise[d], 12.0, [1, -1]), sun_month[d], moon_month[d]) log_file.write(log_data) #PRINT CALENDAR for d in range(1, 367): jd = jd_start - 1 + d [y, m, dt, t] = swisseph.revjul(jd) weekday = (weekday_start - 1 + d) % 7 ################## #Festival details# ################## ###--- MONTHLY VRATAMS ---### #EKADASHI Vratam if tithi_sunrise[d] == 11 or tithi_sunrise[ d] == 12: #One of two consecutive tithis must appear @ sunrise! #check for shukla ekadashi[script] if (tithi_sunrise[d] == 11 and tithi_sunrise[d + 1] == 11): festivals[d + 1] = sarva[script] + '~' + get_ekadashi_name( paksha='shukla', month=moon_month[d], script=script) #moon_month[d] or [d+1]? if moon_month[d + 1] == 4: festivals[d + 1] += '\\\\' + chaturmasya_start[script] if moon_month[d + 1] == 8: festivals[d + 1] += '\\\\' + chaturmasya_end[script] elif (tithi_sunrise[d] == 11 and tithi_sunrise[d + 1] != 11): #Check dashami end time to decide for whether this is sarva[script]/smartha[script] tithi_arunodayam = get_tithi( jd_sunrise[d] - (1 / 15.0) * (jd_sunrise[d] - jd_sunrise[d - 1]) ) #Two muhurtams is 1/15 of day-length if tithi_arunodayam == 10: festivals[d] = smartha[script] + '~' + get_ekadashi_name( paksha='shukla', month=moon_month[d], script=script) festivals[d + 1] = vaishnava[script] + '~' + get_ekadashi_name( paksha='shukla', month=moon_month[d], script=script) if moon_month[d] == 4: festivals[d] += '\\\\' + chaturmasya_start[script] if moon_month[d] == 8: festivals[d] += '\\\\' + chaturmasya_end[script] else: festivals[d] = sarva[script] + '~' + get_ekadashi_name( paksha='shukla', month=moon_month[d], script=script) if moon_month[d] == 4: festivals[d] += '\\\\' + chaturmasya_start[script] if moon_month[d] == 8: festivals[d] += '\\\\' + chaturmasya_end[script] elif (tithi_sunrise[d - 1] != 11 and tithi_sunrise[d] == 12): festivals[d] = sarva[script] + '~' + get_ekadashi_name( paksha='shukla', month=moon_month[d], script=script) if moon_month[d] == 4: festivals[d] += '\\\\' + chaturmasya_start[script] if moon_month[d] == 8: festivals[d] += '\\\\' + chaturmasya_end[script] if tithi_sunrise[d] == 26 or tithi_sunrise[ d] == 27: #One of two consecutive tithis must appear @ sunrise! #check for krishna ekadashi[script] if (tithi_sunrise[d] == 26 and tithi_sunrise[d + 1] == 26): festivals[d + 1] = sarva[script] + '~' + get_ekadashi_name( paksha='krishna', month=moon_month[d], script=script) #moon_month[d] or [d+1]? elif (tithi_sunrise[d] == 26 and tithi_sunrise[d + 1] != 26): #Check dashami end time to decide for whether this is sarva[script]/smartha[script] tithi_arunodayam = get_tithi( jd_sunrise[d] - (1 / 15.0) * (jd_sunrise[d] - jd_sunrise[d - 1]) ) #Two muhurtams is 1/15 of day-length if tithi_arunodayam == 25: festivals[d] = smartha[script] + '~' + get_ekadashi_name( paksha='krishna', month=moon_month[d], script=script) festivals[d + 1] = vaishnava[script] + '~' + get_ekadashi_name( paksha='krishna', month=moon_month[d], script=script) else: festivals[d] = sarva[script] + '~' + get_ekadashi_name( paksha='krishna', month=moon_month[d], script=script) elif (tithi_sunrise[d - 1] != 26 and tithi_sunrise[d] == 27): festivals[d] = sarva[script] + '~' + get_ekadashi_name( paksha='krishna', month=moon_month[d], script=script) #PRADOSHA Vratam if tithi_sunrise[d] == 12 or tithi_sunrise[d] == 13: ldiff_set = (swisseph.calc_ut(jd_sunset[d], swisseph.MOON)[0] - swisseph.calc_ut(jd_sunset[d], swisseph.SUN)[0]) % 360 ldiff_set_tmrw = ( swisseph.calc_ut(jd_sunset[d + 1], swisseph.MOON)[0] - swisseph.calc_ut(jd_sunset[d + 1], swisseph.SUN)[0]) % 360 tithi_sunset = int(1 + math.floor(ldiff_set / 12.0)) tithi_sunset_tmrw = int(1 + math.floor(ldiff_set_tmrw / 12.0)) if tithi_sunset <= 13 and tithi_sunset_tmrw != 13: festivals[d] = pradosham[script] elif tithi_sunset_tmrw == 13: festivals[d + 1] = pradosham[script] if tithi_sunrise[d] == 27 or tithi_sunrise[d] == 28: ldiff_set = (swisseph.calc_ut(jd_sunset[d], swisseph.MOON)[0] - swisseph.calc_ut(jd_sunset[d], swisseph.SUN)[0]) % 360 ldiff_set_tmrw = ( swisseph.calc_ut(jd_sunset[d + 1], swisseph.MOON)[0] - swisseph.calc_ut(jd_sunset[d + 1], swisseph.SUN)[0]) % 360 tithi_sunset = int(1 + math.floor(ldiff_set / 12.0)) tithi_sunset_tmrw = int(1 + math.floor(ldiff_set_tmrw / 12.0)) if tithi_sunset <= 28 and tithi_sunset_tmrw != 28: festivals[d] = pradosham[script] elif tithi_sunset_tmrw == 28: festivals[d + 1] = pradosham[script] #SANKATAHARA chaturthi[script] if tithi_sunrise[d] == 18 or tithi_sunrise[d] == 19: ldiff_moonrise_yest = ( swisseph.calc_ut(jd_moonrise[d - 1], swisseph.MOON)[0] - swisseph.calc_ut(jd_moonrise[d - 1], swisseph.SUN)[0]) % 360 ldiff_moonrise = ( swisseph.calc_ut(jd_moonrise[d], swisseph.MOON)[0] - swisseph.calc_ut(jd_moonrise[d], swisseph.SUN)[0]) % 360 ldiff_moonrise_tmrw = ( swisseph.calc_ut(jd_moonrise[d + 1], swisseph.MOON)[0] - swisseph.calc_ut(jd_moonrise[d + 1], swisseph.SUN)[0]) % 360 tithi_moonrise_yest = int(1 + math.floor(ldiff_moonrise_yest / 12.0)) tithi_moonrise = int(1 + math.floor(ldiff_moonrise / 12.0)) tithi_moonrise_tmrw = int(1 + math.floor(ldiff_moonrise_tmrw / 12.0)) if tithi_moonrise == 19: if tithi_moonrise_yest != 19: #otherwise yesterday would have already been assigned festivals[d] = chaturthi[script] if moon_month[d] == 5: #shravana krishna chaturthi[script] festivals[d] = maha[script] + festivals[d] elif tithi_moonrise_tmrw == 19: festivals[d + 1] = chaturthi[script] if moon_month[ d] == 5: #moon_month[d] and[d+1] are same, so checking [d] is enough festivals[d + 1] = maha[script] + festivals[d + 1] #SHASHTHI Vratam if tithi_sunrise[d] == 5 or tithi_sunrise[d] == 6: if tithi_sunrise[d] == 6 or (tithi_sunrise[d] == 5 and tithi_sunrise[d + 1] == 7): if tithi_sunrise[ d - 1] != 6: #otherwise yesterday would have already been assigned festivals[d] = shashthi[script] if moon_month[d] == 8: #kArtika krishna shashthi[script] festivals[d] = skanda[script] + festivals[d] elif tithi_sunrise[d + 1] == 6: festivals[d + 1] = shashthi[script] if moon_month[ d] == 8: #moon_month[d] and[d+1] are same, so checking [d] is enough festivals[d + 1] = skanda[script] + festivals[d + 1] ###--- OTHER (MAJOR) FESTIVALS ---### #type of month | month number | type of angam (tithi|nakshatram) | angam number | min_t cut off for considering prev day (without sunrise_angam) as festival date purvaviddha_rules = { akshaya_tritiya[script]: ['moon_month', 2, 'tithi', 3, 0], chitra_purnima[script]: ['sun_month', 1, 'tithi', 15, 0], durgashtami[script]: ['moon_month', 7, 'tithi', 8, 0], mahanavami[script]: ['moon_month', 7, 'tithi', 9, 0], vijayadashami[script]: ['moon_month', 7, 'tithi', 10, 0], dipavali[script]: ['moon_month', 7, 'tithi', 29, 0], shankara_jayanti[script]: ['moon_month', 2, 'tithi', 5, 0], yajur_upakarma[script]: ['moon_month', 5, 'tithi', 15, 0], rg_upakarma[script]: ['moon_month', 5, 'nakshatram', 22, 0], sama_upakarma[script]: ['sun_month', 5, 'nakshatram', 13, 0], rishi_panchami[script]: ['moon_month', 6, 'tithi', 5, 0], ananta_chaturdashi[script]: ['moon_month', 6, 'tithi', 14, 0], mahalaya_paksham[script]: ['moon_month', 6, 'tithi', 16, 0], hanumat_jayanti[script]: ['sun_month', 9, 'tithi', 30, 0], ardra_darshanam[script]: ['sun_month', 9, 'nakshatram', 6, 0], ratha_saptami[script]: ['sun_month', 10, 'tithi', 7, 0], goda_jayanti[script]: ['sun_month', 4, 'nakshatram', 11, 0], adi_krittika[script]: ['sun_month', 4, 'nakshatram', 3, 0], phalguni_uttaram[script]: ['sun_month', 12, 'nakshatram', 12, 4], mahalaya_amavasya[script]: ['moon_month', 6, 'tithi', 30, 0], uma_maheshvara_vratam[script]: ['moon_month', 6, 'tithi', 15, 0] } for x in iter(purvaviddha_rules.keys()): rule = purvaviddha_rules[x] if rule[0] == 'moon_month': if moon_month[d] == rule[1]: if rule[2] == 'tithi': fday = get_festival_day_purvaviddha( rule[3], tithi_sunrise, d, jd_sunrise[d], jd_sunrise[d + 1], get_tithi, rule[4]) elif rule[2] == 'nakshatram': fday = get_festival_day_purvaviddha( rule[3], nakshatram_sunrise, d, jd_sunrise[d], jd_sunrise[d + 1], get_nakshatram, rule[4]) if fday is not None: if festival_day_list.has_key(x): if festival_day_list[x][0] != fday: #Second occurrence of a festival within a Gregorian calendar year festival_day_list[x] = [ festival_day_list[x][0], fday ] else: festival_day_list[x] = [fday] elif rule[0] == 'sun_month': if sun_month[d] == rule[1]: if rule[2] == 'tithi': fday = get_festival_day_purvaviddha( rule[3], tithi_sunrise, d, jd_sunrise[d], jd_sunrise[d + 1], get_tithi, rule[4]) elif rule[2] == 'nakshatram': fday = get_festival_day_purvaviddha( rule[3], nakshatram_sunrise, d, jd_sunrise[d], jd_sunrise[d + 1], get_nakshatram, rule[4]) if fday is not None: if festival_day_list.has_key(x): if festival_day_list[x][0] != fday: #Second occurrence of a festival within a Gregorian calendar year festival_day_list[x] = [ festival_day_list[x][0], fday ] else: festival_day_list[x] = [fday] else: print 'Error; unknown string in rule: %s' % (rule[0]) return #NAVARATRI START if moon_month[d] == 7 and moon_month[d - 1] == 6: festival_day_list[navaratri_start[script]] = [d] #PONGAL/AYANAM if sun_month[d] == 10 and sun_month[d - 1] == 9: festival_day_list[uttarayanam[script]] = [d] if sun_month[d] == 4 and sun_month[d - 1] == 3: festival_day_list[dakshinayanam[script]] = [d] if sun_month[d] == 1 and sun_month[d - 1] == 12: festival_day_list[new_yr] = [d] if moon_month[d] == 1 and moon_month[d - 1] != 1: festival_day_list[yugadi[script]] = [d] #SHRIRAMANAVAMI if moon_month[d] == 1: if tithi_sunrise[d] == 8 or tithi_sunrise[d] == 9: t_11 = get_tithi(jd_sunrise[d] + (jd_sunset[d] - jd_sunrise[d]) * (2.0 / 5.0)) #madhyahna1 start t_12 = get_tithi(jd_sunrise[d] + (jd_sunset[d] - jd_sunrise[d]) * (3.0 / 5.0)) #madhyahna1 end t_21 = get_tithi(jd_sunrise[d + 1] + (jd_sunset[d + 1] - jd_sunrise[d + 1]) * (2.0 / 5.0)) #madhyahna2 start t_22 = get_tithi(jd_sunrise[d + 1] + (jd_sunset[d + 1] - jd_sunrise[d + 1]) * (3.0 / 5.0)) #madhyahna2 end if t_11 == 9 or t_12 == 9: if t_21 == 9 or t_22 == 9: festival_day_list[ramanavami[script]] = [d + 1] else: festival_day_list[ramanavami[script]] = [d] #JANMASHTAMI if moon_month[d] == 5: if tithi_sunrise[d] == 22 or tithi_sunrise[d] == 23: t_11 = get_tithi(jd_sunset[d] + (jd_sunrise[d + 1] - jd_sunset[d]) * (7.0 / 15.0)) #nishita1 start t_12 = get_tithi(jd_sunset[d] + (jd_sunrise[d + 1] - jd_sunset[d]) * (8.0 / 15.0)) #nishita1 end #t_11 = get_tithi(jd_sunset[d]+(jd_sunrise[d+1]-jd_sunset[d])*(2.0/5.0))#madhyaratri1 start #t_12 = get_tithi(jd_sunset[d]+(jd_sunrise[d+1]-jd_sunset[d])*(3.0/5.0))#madhyaratri1 end t_21 = get_tithi(jd_sunset[d + 1] + (jd_sunrise[d + 2] - jd_sunset[d + 1]) * (7.0 / 15.0)) #nishita2 start t_22 = get_tithi(jd_sunset[d + 1] + (jd_sunrise[d + 2] - jd_sunset[d + 1]) * (8.0 / 15.0)) #nishita2 end #t_21 = get_tithi(jd_sunset[d+1]+(jd_sunrise[d+2]-jd_sunset[d+1])*(2.0/5.0))#madhyaratri2 start #t_22 = get_tithi(jd_sunset[d+1]+(jd_sunrise[d+2]-jd_sunset[d+1])*(3.0/5.0))#madhyaratri2 end if t_11 == 23 or t_12 == 23: if t_21 == 23 or t_22 == 23: festival_day_list[janmashtami[script]] = [d + 1] else: festival_day_list[janmashtami[script]] = [d] #SHIVARATRI if moon_month[d] == 11: if tithi_sunrise[d] == 28 or tithi_sunrise[d] == 29: t_11 = get_tithi(jd_sunset[d] + (jd_sunrise[d + 1] - jd_sunset[d]) * (7.0 / 15.0)) #nishita1 start t_12 = get_tithi(jd_sunset[d] + (jd_sunrise[d + 1] - jd_sunset[d]) * (8.0 / 15.0)) #nishita1 end t_21 = get_tithi(jd_sunset[d + 1] + (jd_sunrise[d + 2] - jd_sunset[d + 1]) * (7.0 / 15.0)) #nishita2 start t_22 = get_tithi(jd_sunset[d + 1] + (jd_sunrise[d + 2] - jd_sunset[d + 1]) * (8.0 / 15.0)) #nishita2 end if t_11 == 29 or t_12 == 29: if t_21 == 29 or t_22 == 29: festival_day_list[shivaratri[script]] = [d + 1] else: festival_day_list[shivaratri[script]] = [d] #VINAYAKA CHATURTHI if moon_month[d] == 6: if tithi_sunrise[d] == 3 or tithi_sunrise[d] == 4: t_11 = get_tithi(jd_sunrise[d] + (jd_sunset[d] - jd_sunrise[d]) * (2.0 / 5.0)) #madhyahna1 start t_12 = get_tithi(jd_sunrise[d] + (jd_sunset[d] - jd_sunrise[d]) * (3.0 / 5.0)) #madhyahna1 end t_21 = get_tithi(jd_sunrise[d + 1] + (jd_sunset[d + 1] - jd_sunrise[d + 1]) * (2.0 / 5.0)) #madhyahna2 start t_22 = get_tithi(jd_sunrise[d + 1] + (jd_sunset[d + 1] - jd_sunrise[d + 1]) * (3.0 / 5.0)) #madhyahna2 end if t_11 == 4 or t_12 == 4: if t_21 == 4 or t_22 == 4: festival_day_list[vchaturthi[script]] = [d + 1] else: festival_day_list[vchaturthi[script]] = [d] #Add saved festivals festival_day_list[gayatri_japam[script]] = [ festival_day_list[yajur_upakarma[script]][0] + 1 ] festival_day_list[varalakshmi_vratam[script]] = [ festival_day_list[yajur_upakarma[script]][0] - ((weekday_start - 1 + festival_day_list[yajur_upakarma[script]][0] - 5) % 7) ] #KARADAYAN_NOMBU for x in iter(festival_day_list.keys()): for j in range(0, len(festival_day_list[x])): if festivals[festival_day_list[x][j]] != '': festivals[festival_day_list[x][j]] += '\\\\' festivals[festival_day_list[x][j]] += x ###--- ECLIPSES ---### ###--- LUNAR ECLIPSES ---### swisseph.set_topo(lon=longitude, lat=latitude, alt=0.0) #Set location jd = jd_start while 1: next_ecl_lun = swisseph.lun_eclipse_when(jd) jd = next_ecl_lun[1][0] + (tz_off / 24.0) jd_ecl_lun_start = next_ecl_lun[1][2] + (tz_off / 24.0) jd_ecl_lun_end = next_ecl_lun[1][3] + (tz_off / 24.0) ecl_y = swisseph.revjul( jd - 1 )[0] # -1 is to not miss an eclipse that occurs after sunset on 31-Dec! if ecl_y != start_year: break else: ecl_lun_start = swisseph.revjul(jd_ecl_lun_start)[3] ecl_lun_end = swisseph.revjul(jd_ecl_lun_end)[3] if (jd_ecl_lun_start - (tz_off / 24.0)) == 0.0 or (jd_ecl_lun_end - (tz_off / 24.0)) == 0.0: jd = jd + 20 #Move towards the next eclipse... at least the next full moon (>=25 days away) continue fday = int(math.floor(jd_ecl_lun_start) - math.floor(jd_start) + 1) #print '%%',jd,fday,jd_sunrise[fday],jd_sunrise[fday-1] if (jd < (jd_sunrise[fday] + tz_off / 24.0)): fday -= 1 if ecl_lun_start < swisseph.revjul(jd_sunrise[fday + 1] + tz_off / 24.0)[3]: ecl_lun_start += 24 #print '%%',jd,fday,jd_sunrise[fday],jd_sunrise[fday-1],ecl_lun_start, ecl_lun_end jd_moonrise_ecl_day = swisseph.rise_trans( jd_start=jd_sunrise[fday], body=swisseph.MOON, lon=longitude, lat=latitude, rsmi=swisseph.CALC_RISE | swisseph.BIT_DISC_CENTER)[1][0] + (tz_off / 24.0) jd_moonset_ecl_day = swisseph.rise_trans( jd_start=jd_moonrise_ecl_day, body=swisseph.MOON, lon=longitude, lat=latitude, rsmi=swisseph.CALC_SET | swisseph.BIT_DISC_CENTER)[1][0] + (tz_off / 24.0) #if jd_ecl_lun_start<(jd_sunrise[fday]+(tz_off/24.0)): if ecl_lun_end < ecl_lun_start: ecl_lun_end += 24 #print '%%', (jd_ecl_lun_start), (jd_ecl_lun_end), (jd_moonrise_ecl_day), (jd_moonset_ecl_day) #print '%%', swisseph.revjul(jd_ecl_lun_start), swisseph.revjul(jd_ecl_lun_end), swisseph.revjul(jd_moonrise_ecl_day), swisseph.revjul(jd_moonset_ecl_day) if jd_ecl_lun_end < jd_moonrise_ecl_day or jd_ecl_lun_start > jd_moonset_ecl_day: jd = jd + 20 #Move towards the next eclipse... at least the next full moon (>=25 days away) continue lun_ecl_str = chandra_grahanam[script] + '~\\textsf{' + print_time2( ecl_lun_start) + '}{\\RIGHTarrow}\\textsf{' + print_time2( ecl_lun_end) + '}' if festivals[fday] != '': festivals[fday] += '\\\\' festivals[fday] += lun_ecl_str jd = jd + 20 ###--- SOLAR ECLIPSES ---### swisseph.set_topo(lon=longitude, lat=latitude, alt=0.0) #Set location jd = jd_start while 1: next_ecl_sol = swisseph.sol_eclipse_when_loc(julday=jd, lon=longitude, lat=latitude) jd = next_ecl_sol[1][0] + (tz_off / 24.0) jd_ecl_sol_start = next_ecl_sol[1][1] + (tz_off / 24.0) jd_ecl_sol_end = next_ecl_sol[1][4] + (tz_off / 24.0) ecl_y = swisseph.revjul( jd - 1 )[0] # -1 is to not miss an eclipse that occurs after sunset on 31-Dec! if ecl_y != start_year: break else: #print '%%', fday, (jd_ecl_sol_start), (jd_ecl_sol_end), (jd_sunrise[fday]) #print '%%', swisseph.revjul(jd_ecl_sol_start), swisseph.revjul(jd_ecl_sol_end), swisseph.revjul(jd_sunrise[fday]) fday = int(math.floor(jd) - math.floor(jd_start) + 1) if (jd < (jd_sunrise[fday] + tz_off / 24.0)): fday -= 1 #print '%%', fday, (jd_ecl_sol_start), (jd_ecl_sol_end), (jd_sunrise[fday]) #print '%%', swisseph.revjul(jd_ecl_sol_start), swisseph.revjul(jd_ecl_sol_end), swisseph.revjul(jd_sunrise[fday]) ecl_sol_start = swisseph.revjul(jd_ecl_sol_start)[3] ecl_sol_end = swisseph.revjul(jd_ecl_sol_end)[3] if (jd_ecl_sol_start - (tz_off / 24.0)) == 0.0 or ( jd_ecl_sol_end - (tz_off / 24.0) ) == 0.0: # or jd_ecl_end<jd_sunrise[fday] or jd_ecl_start>jd_sunset[fday]: jd = jd + 20 #Move towards the next eclipse... at least the next new moon (>=25 days away) continue if ecl_sol_end < ecl_sol_start: ecl_sol_end += 24 sol_ecl_str = surya_grahanam[script] + '~\\textsf{' + print_time2( ecl_sol_start) + '}{\\RIGHTarrow}\\textsf{' + print_time2( ecl_sol_end) + '}' if festivals[fday] != '': festivals[fday] += '\\\\' festivals[fday] += sol_ecl_str jd = jd + 20 ###--- FESTIVAL ADDITIONS COMPLETE ---### ###--- PRINT LIST OF FESTIVALS (Page 2) ---### if script == 'en': cal = Calendar() print '\\newpage' print '\\centerline {\\LARGE {{%s}}}\\mbox{}\\\\[2cm]' % list_of_festivals[ script] print '\\begin{center}' print '\\begin{minipage}[t]{0.3\\linewidth}' print '\\begin{center}' print '\\begin{tabular}{>{\\sffamily}r>{\\sffamily}r>{\\sffamily}cp{6cm}}' mlast = 1 for d in range(1, 367): jd = jd_start - 1 + d [y, m, dt, t] = swisseph.revjul(jd) weekday = (weekday_start - 1 + d) % 7 if festivals[d] != '': if m != mlast: mlast = m #print '\\hline\\\\' print '\\\\' if m == 5 or m == 9: print '\\end{tabular}' print '\\end{center}' print '\\end{minipage}\hspace{1cm}%' print '\\begin{minipage}[t]{0.3\\linewidth}' print '\\begin{center}' print '\\begin{tabular}{>{\\sffamily}r>{\\sffamily}l>{\\sffamily}cp{6cm}}' print '%s & %s & %s & {\\raggedright %s} \\\\' % ( MON[m], dt, WDAY[weekday], festivals[d]) if script == 'en': event = Event() event.add('summary', festivals[d]) event.add('dtstart', datetime(y, m, dt)) event.add('dtend', datetime(y, m, dt)) cal.add_component(event) if m == 12 and dt == 31: break print '\\end{tabular}' print '\\end{center}' print '\\end{minipage}' print '\\end{center}' print '\\clearpage' if script == 'en': cal_fname = '%s-%4d.ics' % (city_name, start_year) cal_file = open(cal_fname, 'w') cal_file.write(cal.as_string()) cal_file.close() #Layout calendar in LATeX format #We use a separate loop here, because of festivals like varalakshmi #vratam, for which we backtrack to the previous friday from yajur #upakarma and change the list of festivals! for d in range(1, 367): jd = jd_start - 1 + d [y, m, dt, t] = swisseph.revjul(jd) weekday = (weekday_start - 1 + d) % 7 if dt == 1: if m > 1: if weekday != 0: #Space till Sunday for i in range(weekday, 6): print "{} &" print "\\\\ \hline" print '\end{tabular}' print '\n\n' #Begin tabular print '\\begin{tabular}{|c|c|c|c|c|c|c|}' print '\multicolumn{7}{c}{\Large \\bfseries \sffamily %s %s}\\\\[3mm]' % ( month[m], y) print '\hline' print '\\textbf{\\textsf{SUN}} & \\textbf{\\textsf{MON}} & \\textbf{\\textsf{TUE}} & \\textbf{\\textsf{WED}} & \\textbf{\\textsf{THU}} & \\textbf{\\textsf{FRI}} & \\textbf{\\textsf{SAT}} \\\\ \hline' #print '\\textbf{भानु} & \\textbf{इन्दु} & \\textbf{भौम} & \\textbf{बुध} & \\textbf{गुरु} & \\textbf{भृगु} & \\textbf{स्थिर} \\\\ \hline' #Blanks for previous weekdays for i in range(0, weekday): print "{} &" print '\caldata{\\textcolor{%s}{%s}}{%s{%s}}{\\sundata{%s}{%s}{%s}}{\\tnyk{%s}{%s}{%s}{%s}}{\\rahuyama{%s}{%s}}{%s} ' % ( daycol[weekday], dt, month_data[d], get_chandra_masa(moon_month[d], chandra_masa_names, script), sunrise[d], sunset[d], madhya[d], tithi_data_string[d], nakshatram_data_string[d], yogam_data_string[d], karanam_data_string[d], rahu[d], yama[d], festivals[d]) if weekday == 6: print "\\\\ \hline" else: print "&" if m == 12 and dt == 31: break # For debugging specific dates #if m==4 and dt==10: # break for i in range(weekday + 1, 6): print "{} &" if weekday != 6: print "\\\\ \hline" print '\end{tabular}' print '\n\n' print template_lines[-2][:-1] print template_lines[-1][:-1]
def main(): """ Process calendar data present in a feed to build iCalendar events. """ # Grab the feed for processing feed_url = len(sys.argv) > 1 and sys.argv[1] or FEED_URL ics_fn = len(sys.argv) > 2 and sys.argv[2] or ICS_FN # Get the feed, create a new calendar and an hCalendar parser. feed = feedparser.parse(feed_url) cal = Calendar() hp = HCalendarParser() types = TypesFactory() # Scan all the feed entries for calendar events. for entry in feed.entries: # First, check for any hCalendar events in the feed summary # content. if 'summary' in entry: # Attempt to parse the entry summary for hCalendar events. events = hp.parse(entry['summary']) if events: # Add all the events, then continue on to next entry. for e in events: cal.add_component(e) continue # Here's an attempt to map feedparser entry metadata # to event properties. entry_to_event = [ ( 'link', 'url' ), ( 'title', 'summary' ), ( 'summary', 'description' ), ( 'ev_startdate', 'dtstart' ), ( 'ev_enddate', 'dtend' ), ( 'ev_location', 'location' ), ( 'ev_organizer', 'organizer' ), ( 'ev_type', 'type' ), ] # If no events found in entry content, try constructing one from # feed metadata values. event = Event() for entry_key, event_key in entry_to_event: # Check to see this metadata key is in the entry. if entry_key in entry: entry_val = entry[entry_key] # HACK: Get rid of date and time field separators to # better match iCalendar's time format. if event_key.startswith('dt'): entry_val = entry_val.replace('-','').replace(':','') # Convert the entry metadata value to a event date type # and add it to the event. val = types.from_ical(event_key, entry_val.encode('UTF-8')) event.add(event_key, val) # Add the event to the calendar after building it. cal.add_component(event) # Write the iCalendar file out to disk. open(ics_fn, "w").write(cal.as_string())
0, tzinfo=UTC) # iCalendar events must be defined by a time slot with a start and a stop date/time. # There is no such equivalent in SVN: a commit has just a date. # I choose to use the commit date as the end of the iCal event. The start of the event will be set as the commit date minus 5 minutes. event_start = py_datetime - timedelta(minutes=TIME_SLOT) # Create a new calendar event event = Event() event.add('summary', 'SVN REV %s' % revision) event.add('description', '%s:\n\n%s' % (author, msg)) event.add('dtstart', event_start) event.add('dtend', py_datetime) event.add('dtstamp', event_start) event['uid'] = '*****@*****.**' % ( revision, py_datetime, author, random.random()) event.add('priority', 5) cal.add_component(event) commit_count += 1 # Write the iCal file f = open(ical_file, "w") f.write(cal.as_string()) f.close() # Clean-up and exit remove(tmp_log_file) print " INFO - Calendar created as '%s' with %s commits." % (ical_file, commit_count) sys.exit(0)
def get(self): self.response.headers['Content-Type'] = 'text/calendar; charset=utf-8' show_all = "-all" if self.request.get("all") else "" calendar = memcache.get("enzian-calendar" + show_all) if calendar: self.response.out.write(calendar) return cal = Calendar() cal.add('version', '2.0') cal.add('prodid', '-//Enzian Specials by Chad//NONSCML//EN') cal.add('X-WR-CALID', 'dc7c97b1-951d-404f-ab20-3abcf10ad038') cal.add('X-WR-CALNAME', 'Enzian specials') cal.add( 'X-WR-CALDESC', "Enzian makes calendars only for eyeballs. Chad ( https://chad.org/ ) makes computers understand them." ) cal.add('X-WR-TIMEZONE', 'US/Eastern') seen = set() for fortnights_in_advance in range(4): # no "month" math in timedelta. month = datetime.utcnow().date() + timedelta(days=14 * fortnights_in_advance) if month.strftime("%Y-%m") in seen: continue seen.add(month.strftime("%Y-%m")) req = urllib2.Request("http://enzian.org/calendar/" + month.strftime("%Y-%m"), None, headers={'User-Agent': 'Mozilla/5.0'}) page = urllib2.urlopen(req).read() soup = BeautifulSoup(page, convertEntities=BeautifulSoup.HTML_ENTITIES) for item in soup.fetch("div", attrs={"data-tribejson": True}): doc = json.loads(item["data-tribejson"]) tags = set(doc["categoryClasses"].split()) if u'cat_special-program' not in tags: continue if u'tribe-events-category-film-slam' in tags: continue event = Event() if u'cat_popcorn-flicks-in-the-park' in tags: event.add('summary', "park movie: " + doc["title"]) else: event.add('summary', "Enzian: " + doc["title"]) event.add( 'description', re.sub(u"….*", u"…", doc["excerpt"]).replace("<p>", "")) event.add( 'dtstamp', datetime.now()) # todo: make this the modtime of page start = qualified_date(doc["startTime"], month.year) end = qualified_date(doc["endTime"], month.year) event.add('dtstart', start) event.add('dtend', end) event["uid"] = doc["eventId"] cal.add_component(event) self.response.out.write(cal.as_string())
event.add('location', ev['location'].replace(",","\,")) startday = ev['from'].rpartition(" ")[0] startdt = datetime.datetime.strptime(ev['from'], "%b %d, %Y %I:%M%p") event.add('dtstart;VALUE=DATE-TIME', vDatetime(startdt).ical()) #use different parsing strings depending on if no date enddt = datetime.datetime.strptime(ev['to'] if " " in ev['to'] else " ".join([startday,ev['to']]), "%b %d, %Y %I:%M%p") event.add('dtend;VALUE=DATE-TIME', vDatetime(enddt).ical()) event.add('dtstamp;VALUE=DATE-TIME', vDatetime(startdt).ical()) event.add('uid', str(ev['id'])+"/@uoit-guidebook.com") event.add('class', 'PUBLIC') cal.add_component(event) print cal.as_string()import scraperwiki from icalendar import Calendar, Event, UTC, vDatetime import datetime from pytz import timezone sourcescraper = 'uoit_student_center_calendar' scraperwiki.sqlite.attach(sourcescraper) data = scraperwiki.sqlite.select("* from uoit_student_center_calendar.swdata") cal = Calendar() cal.add('version', '2.0') cal.add('prodid', '-//Google Inc//Google Calendar 70.9054//EN') cal.add('calscale', 'GREGORIAN') cal.add('method', 'PUBLISH') cal.add('X-WR-CALNAME', 'UOIT Student Center Calendar')
summary = "%s's Birthday" % name d = data['random']['anniversary'] now = date(date.today().year, d.month, d.day) if now > date.today(): d = date(now.year, d.month, d.day) else: d = date(now.year + 1, d.month, d.day) event.add('summary', summary) event.add('dtstart', d) event.add('dtend', d) event.add('dtstamp', datetime.now(UTC)) event['uid'] = "buttle/" + ''.join( c for c in summary if c in string.ascii_letters + string.digits).lower( ) + "-" + data['random']['anniversary'].isoformat() return event calendar = Calendar() calendar.add('version', '2.0') calendar.add('prodid', '-//buttle//ertius.org//') with open(options.input) as f: for line in f: data = parse_line(line) if data and 'anniversary' in data['random']: event = build_vcal_item(data) calendar.add_component(event) with open(options.output, 'w') as output: output.write(calendar.as_string()[:-2])
def get(self): self.response.headers['Content-Type'] = 'text/calendar' calendar = memcache.get("ksc-calendar") if calendar: self.response.out.write(calendar) return cal = Calendar() cal.add('version', '2.0') cal.add('prodid', '-//Kennedy Space Center launches by Chad//NONSCML//EN') cal.add('X-WR-CALID', '8293bcab-1b27-44dd-8a3c-2bb045888629') cal.add('X-WR-CALNAME', 'KSC launches by Chad') cal.add( 'X-WR-CALDESC', "NASA publishes a web page of scheduled launches, but an iCalendar/RFC5545 feed would be so much better and useful. So, ( https://chad.org/ ) Chad made one. Enjoy!" ) cal.add('X-WR-TIMEZONE', 'US/Eastern') launch_calendar_id = 6089 two_months_ago = datetime.utcnow() + timedelta(days=-60) one_year_from_now = datetime.utcnow() + timedelta(days=365) index_json = urllib2.urlopen( "https://www.nasa.gov/api/1/query/calendar.json?timeRange={0}--{1}&calendars={2}" .format(two_months_ago.strftime("%Y%m%d0000"), one_year_from_now.strftime("%Y%m%d0000"), launch_calendar_id)) index = json.load(index_json) for index_event in index["calendarEvents"]: assert index_event["type"] == "calendar_event" ev_url = "https://www.nasa.gov/api/1/query/node/{0}.json?{1}".format( index_event["nid"], index_event["urlQuery"]) event_json = urllib2.urlopen(ev_url) event_info = json.load(event_json) if "eventDate" in event_info["calendarEvent"]: for i, event_occurance in enumerate( event_info["calendarEvent"]["eventDate"]): event = Event() event.add( 'uid', event_info["calendarEvent"]["uuid"] + "_" + str(i)) event.add('summary', event_info["calendarEvent"]["title"]) event.add('description', event_info["calendarEvent"]["description"]) event.add( 'dtstamp', datetime.fromtimestamp( int(event_info["calendarEvent"]["changed"]))) date_start = datetime.strptime( event_occurance["value"][:-5], "%Y-%m-%dT%H:%M:%S-") date_end = datetime.strptime( event_occurance["value2"][:-5], "%Y-%m-%dT%H:%M:%S-") if event_occurance["date_type"] == "date": event.add("dtstart;value=date", icalendar.vDate(date_start).ical()) event.add("dtend;value=date", icalendar.vDate(date_end).ical()) else: event.add("dtstart", date_start) event.add("dtend", date_end) cal.add_component(event) self.response.out.write(cal.as_string()) for retry in range(3): if not memcache.add("ksc-calendar", cal.as_string(), 60 * 5): logging.warn("Failed to add data to Memcache.") time.sleep(0.5) else: break
ogr_kayitli_dersler = kayitli_dersler(ogr_no) #ogrencinin kayitli dersleri filtre_fonk = ( lambda data: (data['kod'], data['sube']) in ogr_kayitli_dersler ) # sadece ogrencinin kayitli oldugu dersleri almak icin gerekli filtre fonksiyonu ogr_sinav_takvimi = arasinav( filtre_fonk) #ogrencinin kayitli oldugu derslerin programi takvim = Calendar() #takvim olustur takvim.add('proid', '-//TOBB ETU Arasinav Takvimi//%s//' % ogr_no) takvim.add('version', '2.0') for sinav in ogr_sinav_takvimi: event = Event() event.add('summary', sinav['kod']) event.add('description', sinav['ad']) event.add('uid', '%s[%d]@st%s' % (sinav['kod'], sinav['sube'], ogr_no)) if not sinav['saat'] == (u'00:00', u'00:00'): #saati belli olan sinavlar event.add('dtstart', _get_dt(sinav['tarih'], sinav['saat'][0])) event.add('dtend', _get_dt(sinav['tarih'], sinav['saat'][1])) else: #kendi saatinde olan sinavlar pass #tum gunluk event eklenecek takvim.add_component(event) f.write(takvim.as_string()) f.close() # TODO: python2 olayini kesinlestir. gerekli kutuphaneleri dahil et. # TODO: filtre sorununu coz
except: # ignore events with missing dtstart, dtend or summary DEBUGMSG += ' ! skipped an event with missing dtstart, dtend or summary. likely historic or duplicated event.\n' continue newcal.add_component(component) # close the existing file calfile.close() except: # if the file was not readable, we need a errormessage ;) print MY_SHORTNAME + ': Error: reading file:', sys.exc_info()[1] print s # After the loop, we have all of our data and can write the file now try: f = open(ICS_OUT, 'wb') f.write(newcal.as_string()) f.close() DEBUGMSG += 'new calendar written\n' except: print MY_SHORTNAME + ': Error: ', sys.exc_info()[1] if DEBUG == True: try: l = open(DEBUGFILE, 'wb') l.write(DEBUGMSG) l.close() except: print MY_SHORTNAME + ': Error, unable to write log: ', sys.exc_info( )[1] # all done...