日程調整

社内の都合会わせに調整さんをつかったら何となく皆乗り気じゃなくって、これは「社外にプライバシー流出の危険が・・・!」とかみんなが思ったんだと勝手に解釈して(間違い)、社内で作っておくか、とか考えることにして遊ぶ。けど、モデルをどう実現するかで悩む。
とりあえず「08忘年会」とかの情報を持つEventクラスが対多でDateクラスを指定期間分持っていて、DateクラスはUserを持っている、って感じで作ってみた。なんとなくUserも自分持ちしたくてPersonを作る(意味なし。どうせsessionとかauthが面倒くさいので後でUserに直す)。

from django.db import models
from datetime import date
# Create your models here.

class Person(models.Model):
	name = models.CharField(max_length= 20)
	def __unicode__(self):
		return self.name

class EventDate(models.Model):
	date   = models.DateField()
	people = models.ManyToManyField(Person, blank=True)
	def __unicode__(self):
		return str(self.date)

class Event(models.Model):
	name = models.CharField(max_length=50)
	begin= models.DateField()
	end  = models.DateField()
	dates= models.ManyToManyField(EventDate, blank=True)
	def __unicode__(self):
		return self.name
	def save(self):
		super(Event, self).save()
		for i in xrange(self.begin.toordinal(), self.end.toordinal()):
			e = EventDate(date = date.fromordinal(i))
			e.save()
			self.dates.add(e)

shellで弄ってみる。

>>> e = Event(name="A", begin=date(2008, 10, 20), end=date(2008, 12,5))
>>> e.save()
>>> e.dates.all()
[<EventDate: 2008-10-20>, <EventDate: 2008-10-21>, <EventDate: 2008-10-22>, <EventDate: 2008-10-23>, <EventDate: 2008-10-24>, <EventDate: 2008-10-25>, <EventDate: 2008-10-26>, <EventDate: 2008-10-27>, <EventDate: 2008-10-28>, <EventDate: 2008-10-29>, <EventDate: 2008-10-30>, <EventDate: 2008-10-31>, <EventDate: 2008-11-01>, <EventDate: 2008-11-02>, <EventDate: 2008-11-03>, <EventDate: 2008-11-04>, <EventDate: 2008-11-05>, <EventDate: 2008-11-06>, <EventDate: 2008-11-07>, <EventDate: 2008-11-08>, '...(remaining elements truncated)...']
>>> d = e.dates.filter(date=date(2008,11,2))
>>> for p in [Person(name=name) for name in ("A", "B", "C")]:
...   p.save()
... 
>>> 
>>> Person.objects.all()
[<Person: A>, <Person: B>, <Person: C>]
>>> d = e.dates.get(date=date(2008,11,2))
>>> d.people.add(Person.objects.get(name="A"))
>>> d.people.add(Person.objects.get(name="B"))
>>> d2= e.dates.get(date=date(2008,11,5))
>>> d2.people.add(Person.objects.get(name="C"))
>>> d2.people.add(Person.objects.get(name="A"))
>>> for date in e.dates.all():
...   print date.date,
...   for name in names:
...     if date.people.filter(name=name):
...         print " O ",
...     else:
...         print " X ",
...   print
    :
2008-10-30  X   X   X 
2008-10-31  X   X   X 
2008-11-01  X   X   X 
2008-11-02  O   O   X 
2008-11-03  X   X   X 
2008-11-04  X   X   X 
2008-11-05  O   X   O 
2008-11-06  X   X   X 
2008-11-07  X   X   X 
2008-11-08  X   X   X 

    :
    :

とりあえず動いているようなので効率とか気にしない。でいいのかな・・・
しまったこのままでは予定△が表現できない!! 直しなおし。