Discussion:
[Bitpim-devel] Progress on New Calendar Design Implementation
d***@netzero.com
2004-12-11 03:42:13 UTC
Permalink
I completed the initial implementation of the new Calendar design and tested it with my SCH-A650 phone, and it seems to work ok. The initial GUI uses tabs for different areas of a calendar event, similar to and borrowed from the phonebook entry editor design and code. Once the functionality of the new design is thoroughly tested, I'll try the scrolledpanel GUI as Roger suggested for comparison.

Having gone through this exercise, for future & new feature implementation (such as SMS, Todo List, etc.), I'd like to suggest using a dict (or list) of objects with defined attributes/properties (instead of dict of dicts) to pass info between widgets & phones.

Roger, should I go ahead and commit my changes, or how would you like to handle this? My ISP is down so I'm at the mercy of my neighbor's nonsecured wireless network.

-Joe Pham


________________________________________________________________
NetZero Gift Certificates
Give the gift of Internet access this holiday season.
http://www.netzero.com/give
Roger Binns
2004-12-11 06:14:10 UTC
Permalink
Post by d***@netzero.com
I completed the initial implementation of the new Calendar design
and tested it with my SCH-A650 phone, and it seems to work ok.
Can you remind us of what you have different than the previous code?

ie you have a different UI. Is the data storage different and do
you have an old/new converter?
Post by d***@netzero.com
Having gone through this exercise, for future & new feature implementation
(such as SMS, Todo List, etc.), I'd like to suggest using a dict (or list)
of objects with defined attributes/properties (instead of dict of dicts) to
pass info between widgets & phones.
What is the difference between a dict and an object with defined attributes/
properties?
Post by d***@netzero.com
Roger, should I go ahead and commit my changes,
Lets wait till after the build, and then go ahead and commit. Does it
replace the existing code or augment it? If we discover issues before
the following build can it be trivially turned off or not?

BTW I have no issue with it replacing the existing code, and not being
possible to turn off trivially. It just means that we need to test it
against all existing supported phones before the following build and
need some guidance on that. If things are going to break/change, then
I prefer getting them all over with in one big change rather than dribbles
with old and new code not quite working right together.

Roger
d***@netzero.com
2004-12-11 20:44:43 UTC
Permalink
I'll follow up with a post that summarizes the new dicts and some screen shots. The current implementation replaces existing code, but I'll add some changes to allow easy switching between the current & new calendar design. I plan to have this available for the next build.

Roger, when do you plan to do this build? I have some updates to the Samsung codes I'd like to add to this build, but I don't want to hold up the build since it can wait for the next one.

-Joe Pham


________________________________________________________________
NetZero Gift Certificates
Give the gift of Internet access this holiday season.
http://www.netzero.com/give
Roger Binns
2004-12-11 20:58:46 UTC
Permalink
Post by d***@netzero.com
The current implementation replaces existing code, but I'll add some changes to
allow easy switching between the current & new calendar design.
That isn't necessary. It is somewhat preferable to just have one piece
of code providing functionality rather than old and new code present.
If something goes catastrophically wrong then we should just be able to
back out changes to the relevant files.
Post by d***@netzero.com
Roger, when do you plan to do this build? I have some updates to the
Samsung codes I'd like to add to this build, but I don't want to hold
up the build since it can wait for the next one.
It will probably happen on Monday night. If you can test your Samsung
changes by then, then feel free to go ahead and commit them.

Roger
d***@netzero.net
2004-12-13 19:07:55 UTC
Permalink
The data structure and associated GUI of BITPIM calendar has recently been converted from the current version, version 2, to version 3. The changes are summarized as follows:

Version 2 Calendar dict:

int: {
'start': (year, month, day, hour, minute) as integers
'end': (year, month, day, hour, minute) as integers # if you want no end, set to the same value as start, or to the year 4000
'repeat': one of None, "daily", "monfri", "weekly", "monthly", "yearly"
'description': "String description"
'changeserial': Set to integer 1
'snoozedelay': Set to an integer number of minutes (default 0)
'alarm': how many minutes beforehand to set the alarm (use 0 for on-time, None or -1 for no alarm)
'daybitmap': default 0, it will become which days of the week weekly events happen on (eg every monday and friday)
'ringtone': index number of the ringtone for the alarm (use 0 for none - will become a string)
'pos': integer that should be the same as the dictionary key for this entry
'exceptions': (optional) A list of (year,month,day) tuples that repeats are suppressed
}

Version 3 calendar dict:

'string id': CalendarEntry object.

CalendarEntry properties:
description - 'string description'
location - 'string location'
priority - None=no priority, int from 1-10, 1=highest priority
alarm - how many minutes beforehand to set the alarm (use 0 for on-time, None or -1 for no alarm)
allday - True for an allday event, False otherwise
start - (year, month, day, hour, minute) as integers
end - (year, month, day, hour, minute) as integers
serials - list of dicts of serials.
repeat - None, or RepeatEntry object
id - string id of this object. Created the same way as bpserials IDs for phonebook entries. Internally, this is part of the serials dict.
notes - string notes
category - string category
ringtone - string ringtone assignment
wallpaper - string wallpaper assignment.

CalendarEntry methods:
get() - return a copy of the internal dict
set(dict) - set the internal dict with the supplied dict
is_active(y, m, d) - True if this event is active on (y,m,d)
suppress_repeat_entry(y,m,d) - exclude (y,m,d) from this repeat event.

RepeatEntry properties:
repeat_type - one of daily, weekly, monthly, or yearly.
interval - for daily: repeat every nth day. For weekly, for every nth week.
dow - bitmap of which day of week are being repeated.
suppressed - list of (y,m,d) being excluded from this series.

Tasks completed:
- Basic calendar functionality.
- Basic GUI.
- Data conversion functions from version 2 to 3 and version 3 to 2.
- Index file conversion function from version 2 to 3.

Todo list:
- Add/merge entries from phone and other external sources to BITPIM.
Not sure what the matching criteria should be (same start, end, description, etc.)
- More refined conversion of repeat entries from version 3 to 2.
- Switch from tabbed GUI to scrolledpanel GUI for comparison.
- Upgrade individual phone codes to work with version 3.

I'm also attaching some screenshots of the GUI.

All questions and comments are welcome.

-Joe Pham
Roger Binns
2004-12-17 07:15:16 UTC
Permalink
Post by d***@netzero.net
The data structure and associated GUI of BITPIM calendar has recently
been converted from the current version, version 2, to version 3.
Feel free to commit your work now that the build is out the way.
Post by d***@netzero.net
int: {
...
Post by d***@netzero.net
'string id': CalendarEntry object.
...
Post by d***@netzero.net
What is the difference between a dict and an object with defined attributes/
properties?
I also note the stringid creeping back in. What is the benefit?
Post by d***@netzero.net
description - 'string description'
location - 'string location'
priority - None=no priority, int from 1-10, 1=highest priority
The field should just be omitted if no value is set.
Post by d***@netzero.net
alarm - how many minutes beforehand to set the alarm (use 0 for on-time, None or -1 for no alarm)
Same for this one.
Post by d***@netzero.net
allday - True for an allday event, False otherwise
start - (year, month, day, hour, minute) as integers
end - (year, month, day, hour, minute) as integers
allday can be removed. To specify and all day event, the hour and minute can be
omitted. A two day event would have hour and minute omitted from start and end
and have them span two days.
Post by d***@netzero.net
serials - list of dicts of serials.
repeat - None, or RepeatEntry object
Again, it should be omitted if there is no value.
Post by d***@netzero.net
id - string id of this object. Created the same way as bpserials IDs for phonebook
entries. Internally, this is part of the serials dict.
What is this needed for?
Post by d***@netzero.net
notes - string notes
category - string category
ringtone - string ringtone assignment
wallpaper - string wallpaper assignment.
One thing we need to be *very* careful of is that later on we cannot change the
type of something from a value to a list of values without a lot of grief. That
comes down to whether or not we think any of those will ever be multi-valued.
I can't think of any such circumstances. Can anyone else?
I guess various things are equivalent in that you can have the data as a dict
and then seperately methods to operate on them, or combine the two. My only
issue at the moment is that I believe there is a "right answer" and currently
the phonebook and this calendar implementation don't use the same method,
which means one is wrong.

The advantage of the dict mechanism is that it is pure data and is highly
compatible. A version from a year from now will happily read today's
data. There is nothing hidden and nothing munged behind the scenes, just
raw naked data for everyone to deal with.

The advantage of the class mechanism is that you can call methods on the
data itself and it will oblige you with appropriate results. It can also
hide and munge things behind the scenes.

Ultimately this almost comes down to being a syntax issue:

module.getfoo(thedict) vs theobject.getfoo()
Post by d***@netzero.net
- Switch from tabbed GUI to scrolledpanel GUI for comparison.
I think either will be good.

It is really great you are doing all this work. It means I will be able to
use the calendar on my phone again :-)

Roger
Vic Heintz
2004-12-14 01:11:24 UTC
Permalink
Why am I suddenly getting this exception when I do a get phonebook? I
just did a cvs update. I didn't change anything in my module that
involved this variable. Was something changed in com_samsung.py that
would cause this? I am afraid a build is about to be done that will
break support for my phone. Any ideas?

Traceback (most recent call last):
File "/Users/vic/Projects/bitpim/gui.py", line 150, in run
res=call()
File "/Users/vic/Projects/bitpim/gui.py", line 90, in __call__
return apply(self.method, self.args+args, d)
File "/Users/vic/Projects/bitpim/gui.py", line 1165, in getdata
i[1](results)
File "/Users/vic/Projects/bitpim/com_samsungscha670.py", line 248, in
getphonebook
pb_book=self._get_phonebook(result)
File "/Users/vic/Projects/bitpim/com_samsungscha670.py", line 228, in
_get_phonebook
pb_entry=self.get_phone_entry(j,__pb_alias,__pb_atpbokw_field_count)
NameError: global name '_Phone__pb_alias' is not defined

Vic
Vic Heintz
2004-12-14 02:17:03 UTC
Permalink
Post by Vic Heintz
Why am I suddenly getting this exception when I do a get phonebook? I
just did a cvs update. I didn't change anything in my module that
involved this variable. Was something changed in com_samsung.py that
would cause this? I am afraid a build is about to be done that will
break support for my phone. Any ideas?
My fault. I made an unintended edit somewhere along the line. I
checked-in the fixed version. - Vic
d***@netzero.com
2004-12-14 01:46:35 UTC
Permalink
Post by Vic Heintz
pb_entry=self.get_phone_entry(j,__pb_alias,__pb_atpbokw_field_count)
^ ^self.__pbat...
self.__pb_alias

-Joe Pham


________________________________________________________________
NetZero Gift Certificates
Give the gift of Internet access this holiday season.
http://www.netzero.com/give
d***@netzero.com
2004-12-18 08:04:06 UTC
Permalink
Post by Roger Binns
Feel free to commit your work now that the build is out the way.
I just did. Please try it out and let me know what you think.
Post by Roger Binns
What is the difference between a dict and an object with defined
attributes/properties?
Later on in your post, I think you answered this question pretty well, touching on the pros and cons of both sides. One minor thing you did not point out is that an object would have a well defined set of properties whereas a dict can take on anything. For example, you can mistype a dict key (in my case 'ringtones-index' instead of 'ringtone-index') and the dict would happily take it and not complain, but the code would not work. That would not be the case for an object.
Post by Roger Binns
I also note the stringid creeping back in. What is the benefit?
I modeled this after your design of the database storage. It is an entry in the list 'serials' that looks like this:
'sourcetype': 'bitpim', 'id': <random generated hex string>
This entry is created for every object at instantiation time and can be used as the dict key. ie: calendar[object.id]=object.
Post by Roger Binns
The field should just be omitted if no value is set.
In general, this is true for the internal data of the object. However, you'd get a None back if you get the value through its property. This is also true in the context of passing dict data
between bpcalendar and com_phone* should we decide to take that route.
Post by Roger Binns
That comes down to whether or not we think any of those will ever be >multi-valued. I can't think of any such circumstances. Can anyone >else?
I can't either.
Post by Roger Binns
My only issue at the moment is that I believe there is a "right
answer" and currently the phonebook and this calendar implementation
don't use the same method, which means one is wrong.
I assume you're talking about the means of exchanging data between bpcalendar & com_phone*. Within that context, I don't think of it so much as "right" or "wrong" answer but more of different approaches to achieve the same goal. I have my personal preference, but can accommodate either approach.
Post by Roger Binns
Post by d***@netzero.net
- Switch from tabbed GUI to scrolledpanel GUI for comparison.
I think either will be good.
Please let me know what you think of the new (tabbed) GUI.

-Joe Pham



________________________________________________________________
NetZero Gift Certificates
Give the gift of Internet access this holiday season.
http://www.netzero.com/give
Roger Binns
2004-12-18 09:02:33 UTC
Permalink
Post by d***@netzero.com
I just did. Please try it out and let me know what you think.
Way better than before :-)

Non-cosmetic comments:

- Drop the type selector for wallpaper and ringtone tab
- See if the category manager can be invoked from the
categories tab
- At some point we will want the changed fields to show
up in a different way (eg colour or bold). That will
give an indication what the revert button will undo.
It would be nice if the revert also becomes available
to the phonebook editor.
- There needs to be the ability to have multiple categories
and to order them. I think the category control could
be changed to a single control like you get with View
Columns with Move Up/Down, select add and delete buttons.

Cosmetic stuff:

- The dialog comes up a little bit too narrow for me.
- Change the "description" label to be "summary". That way people
won't get upset at it not letting them enter much information.
- The labels in priority should be "1 - Highest", "5 - Normal",
"10 - Lowest"
- The Notes doohickey should wx.EXPAND to the space available
- Various layouts should be tweaked to move items away from the edges
of the pane
- It may be better to have daily/weekly repeat options visible but
grayed out until the relevant type is chosen. That way users
can see what is possible. It will also fill up all that empty
space :-)
Post by d***@netzero.com
Later on in your post, I think you answered this question pretty well,
touching on the pros and cons of both sides. One minor thing you did
not point out is that an object would have a well defined set of
properties whereas a dict can take on anything. For example, you can
mistype a dict key (in my case 'ringtones-index' instead of
'ringtone-index') and the dict would happily take it and not complain,
but the code would not work. That would not be the case for an object.
I'll admit to having made that same mistake as well once or twice :-)

The issue is that the item *needs* to accept any key. This is especially
likely to happen if they use a more recent version of BitPim and then
go back to an older one. The FILE_VERSION didn't work well in practise.
Any version should be able to deal with new keys from future versions,
just by ignoring them.

(We can still use objects for this - just have it whine about unknown
keys when run from the dev tree, but be silent when running
production)
Post by d***@netzero.com
Post by Roger Binns
I also note the stringid creeping back in. What is the benefit?
I modeled this after your design of the database storage. It is an
'sourcetype': 'bitpim', 'id': <random generated hex string>
This entry is created for every object at instantiation time and can
be used as the dict key. ie: calendar[object.id]=object.
Ok, I see what you are trying to do and it is a bad idea (trust me).
Just use plain integers for the dict key (which makes it behave
like a list that can have holes). That will also make things
work right during times like importing, syncing, merging and
various other times when multiple lists of entries are in play.

If the id field is calculated in the fly that is ok. It should
definitely not be stored seperately. There isn't much use for
it except for undo.

(And you are right about what the database code is doing behind
the scenes. However the intention is abstracting out the entry id
and how it is found which will be useful for other datatypes
that aren't structured like the phonebook and calendar.
Post by d***@netzero.com
Post by Roger Binns
The field should just be omitted if no value is set.
In general, this is true for the internal data of the object.
However, you'd get a None back if you get the value through its
property. This is also true in the context of passing dict data
between bpcalendar and com_phone* should we decide to take that route.
I don't like doing that because None gets confusing. One context
would be "this value is set to a none value" and the other would
be "this value has never been set". They are semantically different,
although in many cases it will make no difference.
Post by d***@netzero.com
I assume you're talking about the means of exchanging data between
bpcalendar & com_phone*. Within that context, I don't think of it
so much as "right" or "wrong" answer but more of different approaches
to achieve the same goal. I have my personal preference, but can
accommodate either approach.
I am referring to how the data is stored internally. This format
is a superset of what we accept via import and from phones and
is what the phone and export code have to deal with write back
out/export. (It is especially important that if you suck data
in, it is the same when it is spat back out. There are already
cases where this doesn't happen in the phonebook such as internally
we only store "fax" whereas some data sources have "business fax"
and "home fax".)

I do think it is important that the calendar and phonebook operate
the same way in terms of the data being an object vs being a dict
with seperate methods. Whatever the resulting mechanism will
then also be extended to the other data types as we get round
to them.

I think the approach to take is the following:

- use objects
- the object should be a subclass of dict
- in the constructor and setitem methods it should print
a complaint about unknown keys (prints are automatically
ignored in production builds)
- "properties" that are not present generate an exception
when accessed and are semantically different than
"properties" set to None

We can use the factory pattern for constructing the objects
so the factory can decide what to do about data that gets
attached such as lists of dicts (it can wrap them in objects
also derived from list and dict respectively) or leave them
as is.

This approach will let the existing codebase treat the
entries as dicts, but also gives us a convenient place
to hang methods on.
Post by d***@netzero.com
Please let me know what you think of the new (tabbed) GUI.
Looks good. It seems like we will definitely need tabs
for the wallpaper and ringtones, so we may as well have
tabs for everything. Both Outlook and Evolution take the
approach of stuffing as many of the most frequently used
fields as possible on the first tab with less frequent
stuff on other tabs.

Roger
Roger Binns
2004-12-18 16:45:14 UTC
Permalink
Post by Roger Binns
- "properties" that are not present generate an exception
when accessed and are semantically different than
"properties" set to None
Actually it turns out I can't do that with the database
since it doesn't distinguish between not present and None
except at the column level for an entire table.

So we can make the property access return the value as
None, but when used as a dict not be present.

Roger
d***@netzero.com
2004-12-19 06:39:31 UTC
Permalink
Post by Roger Binns
- Drop the type selector for wallpaper and ringtone tab
Is this also applicable to phonebookentryeditor or just calendar?
Post by Roger Binns
- See if the category manager can be invoked from the categories tab
Will add the button to bring up the cat manager similar to phonebookentryeditor.
Post by Roger Binns
- At some point we will want the changed fields to show
up in a different way (eg colour or bold). That will
give an indication what the revert button will undo.
It would be nice if the revert also becomes available
to the phonebook editor.
Something to add down the road.
Post by Roger Binns
- There needs to be the ability to have multiple categories
and to order them. I think the category control could
be changed to a single control like you get with View
Columns with Move Up/Down, select add and delete buttons.
How about multiple selection list box, or choice list box instead?
Post by Roger Binns
- The dialog comes up a little bit too narrow for me.
- Change the "description" label to be "summary". That way people
won't get upset at it not letting them enter much information.
- The labels in priority should be "1 - Highest", "5 - Normal",
"10 - Lowest"
- The Notes doohickey should wx.EXPAND to the space available
- Various layouts should be tweaked to move items away from the
edges of the pane
- It may be better to have daily/weekly repeat options visible but
grayed out until the relevant type is chosen. That way users
can see what is possible. It will also fill up all that empty
space :-)
All doable.
Post by Roger Binns
Any version should be able to deal with new keys from future versions,
just by ignoring them.
(We can still use objects for this - just have it whine about unknown
keys when run from the dev tree, but be silent when running
production)
The current implementation works like this when retrieving dict info from index file, ie. version 2 blcalendar would read version 3 index files with no errors. However, the contents would not work properly for obvious reasons.
Post by Roger Binns
- use objects
- the object should be a subclass of dict
Should both forms of access be allowed: calendar.description='string' and calendar['description']='string'
Post by Roger Binns
- in the constructor and setitem methods it should print
a complaint about unknown keys (prints are automatically
ignored in production builds)
No exception raised?
Post by Roger Binns
So we can make the property access return the value as
None, but when used as a dict not be present.
Shoule we be using dict of objects or dict of dicts for passing data between bpcalendar and com_phone* and between bpcalendar and database ?

-Joe Pham


________________________________________________________________
NetZero Gift Certificates
Give the gift of Internet access this holiday season.
http://www.netzero.com/give
Roger Binns
2004-12-19 17:57:06 UTC
Permalink
Post by d***@netzero.com
Post by Roger Binns
- Drop the type selector for wallpaper and ringtone tab
Is this also applicable to phonebookentryeditor or just calendar?
Just calendar. For the phonebook, wallpapers and ringtones
do have multiple purposes. For example you can set a different
ringtone when someone sends you an SMS vs when they call you.
Post by d***@netzero.com
Post by Roger Binns
- There needs to be the ability to have multiple categories
and to order them. I think the category control could
be changed to a single control like you get with View
Columns with Move Up/Down, select add and delete buttons.
How about multiple selection list box, or choice list box instead?
You can't order those. The order matters. For example when writing/
exporting to something that takes only one category, we have to use
the one the user gave the highest priority. If it takes 3, then we
take the top 3 etc.
Post by d***@netzero.com
The current implementation works like this when retrieving dict
info from index file, ie. version 2 blcalendar would read version 3
index files with no errors. However, the contents would not work
properly for obvious reasons.
That isn't strictly speaking true. For example BitPim 0.7.10 won't
be able to read version 3 and do the right thing. I dropped the
fileversion stuff from the new database implementation.

Think of the user doing the following set of actions. Runs BP 0.7.24.
Then runs 0.7.34. Then runs 0.7.24 again. Imagine that 0.7.30 added
some new fields.
Post by d***@netzero.com
Should both forms of access be allowed: calendar.description='string'
and calendar['description']='string'
Yes. The dict form should generate an exception if the key is not
present whereas attribute access will always return a value, or
None if the key is not present.
Post by d***@netzero.com
Post by Roger Binns
- in the constructor and setitem methods it should print
a complaint about unknown keys (prints are automatically
ignored in production builds)
No exception raised?
Correct - it isn't an error. Using the version number stuff earlier,
say 0.7.30 added a new field "screen" which controlled if the alarm
is shown on the inside or outside screen on some phones. If the user
uses 0.7.34 they will have some entries with that field set. If they
then use 0.7.24 again, it will see the "screen" key and should preserve
its value, but will otherwise just ignore it. That isn't a situation
to raise an exception in. This will allow us to be both forwards
and backwards compatible. (And we'll have undo so users can never
actually lose data).

Now it could have been a typo. In the 0.7.24 code we don't know if
it is an attribute/key from a future version of the program or a
typo. That is why we'll just print about it, which is seen in
developer code but discarded in production builds.
Post by d***@netzero.com
Shoule we be using dict of objects or dict of dicts for passing
data between bpcalendar and com_phone* and between bpcalendar and
database ?
Both :-) That is the point of making the object subclass from dict.
Code that just wants to deal with dicts can do so (ie our entire
existing body of code) and code that wants objects can do that
as well.

Roger
d***@netzero.com
2004-12-19 20:33:40 UTC
Permalink
Post by Roger Binns
Post by d***@netzero.com
Post by Roger Binns
- There needs to be the ability to have multiple categories
and to order them. I think the category control could
be changed to a single control like you get with View
Columns with Move Up/Down, select add and delete buttons.
How about multiple selection list box, or choice list box instead?
You can't order those. The order matters
Understood. If users can re-order selections in a listbox or choice listbox, then would that also be ok? I'm not trying to avoid the design in phonebookentryeditor, just exploring other options. I think this also implies that calendar['categories']=['cat1', 'cat2'] instead of calendar['categories']='cat'

I assume it's a good thing that I have fewer and fewer questions :-)

-Joe Pham


________________________________________________________________
NetZero Gift Certificates
Give the gift of Internet access this holiday season.
http://www.netzero.com/give
Roger Binns
2004-12-19 21:31:50 UTC
Permalink
Post by d***@netzero.com
Understood. If users can re-order selections in a listbox or choice listbox,
then would that also be ok?
Yes, except the stock list boxes don't have the re-ordering. That is why
I suggested stealing the View > Columns code which does exactly all this.
Post by d***@netzero.com
I'm not trying to avoid the design in phonebookentryeditor,
At the moment that solves it by having multiple category selectors, but
it is somewhat ugly and would be better as a single control like View > Columns.
Post by d***@netzero.com
I think this also implies that calendar['categories']=['cat1', 'cat2']
instead of calendar['categories']='cat'
Correct. That is also why it is important that we decide upfront what
can only ever be single valued, and what can be multi-valued. A single
string looks like a list of one character strings. It gets tedious putting
in code trying to figure out if it was passed a list or a string,
especially as there are two string types (ordinary and unicode).

You may note that the phonebook data structure has *everything* as a list
of values. I don't think the calendar needs to be that extreme.

It is also currently a requirement of the database code that when there
is a list each item must be a dict. So it should be:

calendaritem['categories']=[ {'category': 'cat1'}, {'category': 'cat2'} ]

This makes life easier for various reasons, and also gives us somewhere to
hang extra fields about each value in the future. For example if we needed
to note if the category name is case sensitive then the first one would
become:

{'category': 'cat1', 'casesensitive': True}
Post by d***@netzero.com
I assume it's a good thing that I have fewer and fewer questions :-)
Questions are always good. It makes us think :-)

Roger
d***@netzero.com
2004-12-19 23:13:25 UTC
Permalink
Post by Roger Binns
At the moment that solves it by having multiple category selectors,
but it is somewhat ugly and would be better as a single control like >View > Columns.
I was thinking about the same thing.
Post by Roger Binns
It is also currently a requirement of the database code that when
calendaritem['categories']=[ 'category': 'cat1'},
'category': 'cat2'} ]
I did not know that, it's a good thing that you told me.

Btw, is your database stuff ready for implementation. I'd like to try it out with the calendar stuff.

-Joe Pham



________________________________________________________________
NetZero Gift Certificates
Give the gift of Internet access this holiday season.
http://www.netzero.com/give
Roger Binns
2004-12-20 02:09:59 UTC
Permalink
Post by d***@netzero.com
Post by Roger Binns
It is also currently a requirement of the database code that when
calendaritem['categories']=[ 'category': 'cat1'},
'category': 'cat2'} ]
I did not know that, it's a good thing that you told me.
The simple implementation currently just treats each row in a table as
a dict.
Post by d***@netzero.com
Btw, is your database stuff ready for implementation. I'd like to
try it out with the calendar stuff.
The code definitely works correctly, and has good performance. I
am busy working on the base class (derived from dict) and factory
for records and should be commiting that this evening.

Roger

Loading...