[CalendarServer-changes] [7578] CalendarServer/trunk/contrib/tools/fakecalendardata.py

source_changes at macosforge.org source_changes at macosforge.org
Thu Jun 9 17:13:59 PDT 2011


Revision: 7578
          http://trac.macosforge.org/projects/calendarserver/changeset/7578
Author:   cdaboo at apple.com
Date:     2011-06-09 17:13:59 -0700 (Thu, 09 Jun 2011)
Log Message:
-----------
Quick tool to generate a stream of "random" calendar data.

Added Paths:
-----------
    CalendarServer/trunk/contrib/tools/fakecalendardata.py

Added: CalendarServer/trunk/contrib/tools/fakecalendardata.py
===================================================================
--- CalendarServer/trunk/contrib/tools/fakecalendardata.py	                        (rev 0)
+++ CalendarServer/trunk/contrib/tools/fakecalendardata.py	2011-06-10 00:13:59 UTC (rev 7578)
@@ -0,0 +1,212 @@
+#!/usr/bin/env python
+##
+# Copyright (c) 2011 Apple Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##
+
+import datetime
+import getopt
+import os
+import random
+import sys
+import uuid
+
+outputFile = None
+fileCount = 0
+lastWeek = None
+
+calendar_template = """BEGIN:VCALENDAR
+VERSION:2.0
+CALSCALE:GREGORIAN
+PRODID:-//Apple Inc.//iCal 4.0.3//EN
+BEGIN:VTIMEZONE
+TZID:America/Los_Angeles
+BEGIN:STANDARD
+DTSTART:20071104T020000
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+TZNAME:PST
+TZOFFSETFROM:-0700
+TZOFFSETTO:-0800
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:20070311T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+TZNAME:PDT
+TZOFFSETFROM:-0800
+TZOFFSETTO:-0700
+END:DAYLIGHT
+END:VTIMEZONE
+%(VEVENTS)s\
+END:VCALENDAR
+"""
+
+vevent_template = """\
+BEGIN:VEVENT
+UID:%(UID)s
+DTSTART;TZID=America/Los_Angeles:%(START)s
+DURATION:P1H
+%(RRULE)s\
+CREATED:20100729T193912Z
+DTSTAMP:20100729T195557Z
+%(ORGANIZER)s\
+%(ATTENDEES)s\
+SEQUENCE:0
+SUMMARY:%(SUMMARY)s
+TRANSP:OPAQUE
+END:VEVENT
+"""
+
+attendee_template = """\
+ATTENDEE;CN=User %(SEQUENCE)02d;CUTYPE=INDIVIDUAL;EMAIL=user%(SEQUENCE)02d at example.com;PARTSTAT=NE
+ EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:urn:uuid:user%(SEQUENCE)02d
+"""
+
+organizer_template = """\
+ORGANIZER;CN=User %(SEQUENCE)02d;EMAIL=user%(SEQUENCE)02d at example.com:urn:uuid:user%(SEQUENCE)02d
+ATTENDEE;CN=User %(SEQUENCE)02d;EMAIL=user%(SEQUENCE)02d at example.com;PARTSTAT=ACCEPTE
+ D:urn:uuid:user%(SEQUENCE)02d
+"""
+
+summary_template = "Event %d"
+rrules_template = (
+    "RRULE:FREQ=DAILY;COUNT=5\n",
+    "RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR\n",
+    "RRULE:FREQ=YEARLY\n",
+)
+
+def makeVEVENT(recurring, atendees, date, hour, count):
+    
+    subs = {
+        "UID": str(uuid.uuid4()),
+        "START" : "",
+        "RRULE" : "",
+        "ORGANIZER" : "",
+        "ATTENDEES" : "",
+        "SUMMARY"   : summary_template % (count,)
+    }
+
+    if recurring:
+        subs["RRULE"] = random.choice(rrules_template)
+    
+    if attendees:
+        subs["ORGANIZER"] = organizer_template % {"SEQUENCE": 1}
+        for ctr in range(2, random.randint(2, 10)):
+            subs["ATTENDEES"] += attendee_template % {"SEQUENCE": ctr}
+    
+    subs["START"] = "%04d%02d%02dT%02d0000" % (date.year, date.month, date.day, hour)
+
+    return vevent_template % subs 
+
+def argPath(path):
+    fpath = os.path.expanduser(path)
+    if not fpath.startswith("/"):
+        fpath = os.path.join(pwd, fpath)
+    return fpath
+
+def usage(error_msg=None):
+    if error_msg:
+        print error_msg
+
+    print """Usage: fakecalendardata [options]
+Options:
+    -h          Print this help and exit
+    -a          Percentage of events that should include attendees
+    -c          Total number of events to generate
+    -d          Directory to store separate .ics files into
+    -r          Percentage of recurring events to create
+    -p          Numbers of years in the past to start at
+    -f          Number of years into the future to end at
+
+Arguments: None
+
+Description:
+This utility will generate fake iCalendar data either into a single .ics
+file or into multiple .ics files.
+"""
+
+    if error_msg:
+        raise ValueError(error_msg)
+    else:
+        sys.exit(0)
+
+if __name__ == "__main__":
+
+    outputDir = None
+    totalCount = 10
+    percentRecurring = 20
+    percentWithAttendees = 10
+    yearsPast = 2
+    yearsFuture = 1
+
+    options, args = getopt.getopt(sys.argv[1:], "a:c:f:hd:p:r:", [])
+
+    for option, value in options:
+        if option == "-h":
+            usage()
+        elif option == "-a":
+            percentWithAttendees = int(value)
+        elif option == "-c":
+            totalCount = int(value)
+        elif option == "-d":
+            outputDir = argPath(value)
+        elif option == "-f":
+            yearsFuture = int(value)
+        elif option == "-p":
+            yearsPast = int(value)
+        elif option == "-r":
+            percentRecurring = int(value)
+        else:
+            usage("Unrecognized option: %s" % (option,))
+
+    if outputDir and not os.path.isdir(outputDir):
+        usage("Must specify a valid output directory.")
+
+    # Process arguments
+    if len(args) != 0:
+        usage("No arguments allowed")
+
+    pwd = os.getcwd()
+
+    totalRecurring = (totalCount * percentRecurring) / 100
+    totalRecurringWithAttendees = (totalRecurring * percentWithAttendees) / 100
+    totalRecurringWithoutAttendees = totalRecurring - totalRecurringWithAttendees
+    
+    totalNonRecurring = totalCount - totalRecurring
+    totalNonRecurringWithAttendees = (totalNonRecurring * percentWithAttendees) / 100
+    totalNonRecurringWithoutAttendees = totalNonRecurring - totalNonRecurringWithAttendees
+
+    eventTypes = []
+    eventTypes.extend([(True, True) for _ignore in range(totalRecurringWithAttendees)])
+    eventTypes.extend([(True, False) for _ignore in range(totalRecurringWithoutAttendees)])
+    eventTypes.extend([(False, True) for _ignore in range(totalNonRecurringWithAttendees)])
+    eventTypes.extend([(False, False) for _ignore in range(totalNonRecurringWithoutAttendees)])
+    random.shuffle(eventTypes)
+
+    totalYears = yearsPast + yearsFuture
+    totalDays = totalYears * 365
+    
+    startDate = datetime.date.today() - datetime.timedelta(days=yearsPast*365)
+
+    for i in range(len(eventTypes)):
+        eventTypes[i] += (
+            startDate + datetime.timedelta(days=random.randint(0, totalDays)),
+            random.randint(8, 18),
+        )
+
+    vevents = []
+    for count, (recurring, attendees, date, hour) in enumerate(eventTypes):
+        #print recurring, attendees, date, hour
+        vevents.append(makeVEVENT(recurring, attendees, date, hour, count+1))
+
+    print calendar_template % {"VEVENTS" : "".join(vevents)}


Property changes on: CalendarServer/trunk/contrib/tools/fakecalendardata.py
___________________________________________________________________
Added: svn:executable
   + *
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110609/c0b76582/attachment.html>


More information about the calendarserver-changes mailing list