Mercurial > p > roundup > code
comparison roundup/admin.py @ 1905:dc43e339e607
Centralised conversion of user-input data to hyperdb values
(bug [SF#802405], bug [SF#817217], rfe [SF#816994])
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Tue, 11 Nov 2003 00:35:14 +0000 |
| parents | d2ad3309c415 |
| children | d157b9b56ebf |
comparison
equal
deleted
inserted
replaced
| 1904:9445caec3ff5 | 1905:dc43e339e607 |
|---|---|
| 14 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | 14 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
| 15 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" | 15 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS" |
| 16 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, | 16 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, |
| 17 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | 17 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
| 18 # | 18 # |
| 19 # $Id: admin.py,v 1.59 2003-10-24 19:48:05 jlgijsbers Exp $ | 19 # $Id: admin.py,v 1.60 2003-11-11 00:35:13 richard Exp $ |
| 20 | 20 |
| 21 '''Administration commands for maintaining Roundup trackers. | 21 '''Administration commands for maintaining Roundup trackers. |
| 22 ''' | 22 ''' |
| 23 | 23 |
| 24 import sys, os, getpass, getopt, re, UserDict, shutil, rfc822 | 24 import sys, os, getpass, getopt, re, UserDict, shutil, rfc822 |
| 567 for classname, itemid in designators: | 567 for classname, itemid in designators: |
| 568 cl = self.get_class(classname) | 568 cl = self.get_class(classname) |
| 569 | 569 |
| 570 properties = cl.getprops() | 570 properties = cl.getprops() |
| 571 for key, value in props.items(): | 571 for key, value in props.items(): |
| 572 proptype = properties[key] | 572 try: |
| 573 if isinstance(proptype, hyperdb.Multilink): | 573 props[key] = hyperdb.rawToHyperdb(self.db, cl, itemid, |
| 574 if value is None: | 574 key, value) |
| 575 props[key] = [] | 575 except hyperdb.HyperdbValueError, message: |
| 576 else: | 576 raise UsageError, message |
| 577 props[key] = value.split(',') | |
| 578 elif value is None: | |
| 579 continue | |
| 580 elif isinstance(proptype, hyperdb.String): | |
| 581 continue | |
| 582 elif isinstance(proptype, hyperdb.Password): | |
| 583 m = pwre.match(value) | |
| 584 if m: | |
| 585 # password is being given to us encrypted | |
| 586 p = password.Password() | |
| 587 p.scheme = m.group(1) | |
| 588 p.password = m.group(2) | |
| 589 props[key] = p | |
| 590 else: | |
| 591 props[key] = password.Password(value) | |
| 592 elif isinstance(proptype, hyperdb.Date): | |
| 593 try: | |
| 594 props[key] = date.Date(value) | |
| 595 except ValueError, message: | |
| 596 raise UsageError, '"%s": %s'%(value, message) | |
| 597 elif isinstance(proptype, hyperdb.Interval): | |
| 598 try: | |
| 599 props[key] = date.Interval(value) | |
| 600 except ValueError, message: | |
| 601 raise UsageError, '"%s": %s'%(value, message) | |
| 602 elif isinstance(proptype, hyperdb.Link): | |
| 603 props[key] = value | |
| 604 elif isinstance(proptype, hyperdb.Boolean): | |
| 605 props[key] = value.lower() in ('yes', 'true', 'on', '1') | |
| 606 elif isinstance(proptype, hyperdb.Number): | |
| 607 props[key] = float(value) | |
| 608 | 577 |
| 609 # try the set | 578 # try the set |
| 610 try: | 579 try: |
| 611 apply(cl.set, (itemid, ), props) | 580 apply(cl.set, (itemid, ), props) |
| 612 except (TypeError, IndexError, ValueError), message: | 581 except (TypeError, IndexError, ValueError), message: |
| 775 else: | 744 else: |
| 776 props = self.props_from_args(args[1:]) | 745 props = self.props_from_args(args[1:]) |
| 777 | 746 |
| 778 # convert types | 747 # convert types |
| 779 for propname, value in props.items(): | 748 for propname, value in props.items(): |
| 780 # get the property | 749 try: |
| 781 try: | 750 props[key] = hyperdb.rawToHyperdb(self.db, cl, None, |
| 782 proptype = properties[propname] | 751 propname, value) |
| 783 except KeyError: | 752 except hyperdb.HyperdbValueError, message: |
| 784 raise UsageError, _('%(classname)s has no property ' | 753 raise UsageError, message |
| 785 '"%(propname)s"')%locals() | |
| 786 | |
| 787 if isinstance(proptype, hyperdb.Date): | |
| 788 try: | |
| 789 props[propname] = date.Date(value) | |
| 790 except ValueError, message: | |
| 791 raise UsageError, _('"%(value)s": %(message)s')%locals() | |
| 792 elif isinstance(proptype, hyperdb.Interval): | |
| 793 try: | |
| 794 props[propname] = date.Interval(value) | |
| 795 except ValueError, message: | |
| 796 raise UsageError, _('"%(value)s": %(message)s')%locals() | |
| 797 elif isinstance(proptype, hyperdb.Password): | |
| 798 m = pwre.match(value) | |
| 799 if m: | |
| 800 # password is being given to us encrypted | |
| 801 p = password.Password() | |
| 802 p.scheme = m.group(1) | |
| 803 p.password = m.group(2) | |
| 804 props[propname] = p | |
| 805 else: | |
| 806 props[propname] = password.Password(value) | |
| 807 elif isinstance(proptype, hyperdb.Multilink): | |
| 808 props[propname] = value.split(',') | |
| 809 elif isinstance(proptype, hyperdb.Boolean): | |
| 810 props[propname] = value.lower() in ('yes', 'true', 'on', '1') | |
| 811 elif isinstance(proptype, hyperdb.Number): | |
| 812 props[propname] = float(value) | |
| 813 | 754 |
| 814 # check for the key property | 755 # check for the key property |
| 815 propname = cl.getkey() | 756 propname = cl.getkey() |
| 816 if propname and not props.has_key(propname): | 757 if propname and not props.has_key(propname): |
| 817 raise UsageError, _('you must provide the "%(propname)s" ' | 758 raise UsageError, _('you must provide the "%(propname)s" ' |
