1. Trang chủ
  2. » Công Nghệ Thông Tin

The Zope Bible phần 6 ppsx

65 290 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 65
Dung lượng 587,5 KB

Nội dung

295 Chapter 10 ✦ Creating a Multi-User AddressBook <td><input type=text name=”title”></td> </tr> <tr> <td colspan=2><input type=submit value=”Add Addressit”></td> </tr> </table> </form> <dtml-var standard_html_footer> This code is almost completely identical to the addAddressbookForm.dtml file, except for different labels on the form, and a different target ( manage_addAddressit) for the form. Next add an indexAdressit.dtml file to the same folder, with the code from Listing 10-2. Listing 10-2: IndexAddressit.dtml <dtml-var standard_html_header> <dtml-unless SelectedGroup> <dtml-call “REQUEST.set(‘SelectedGroup’, ‘All’)”> </dtml-unless> <dtml-unless start> <dtml-call “REQUEST.set(‘start’, 1)”> </dtml-unless> <dtml-unless sort_by> <dtml-call “REQUEST.set(‘sort_by’, ‘LastName,FirstName,MiddleInitial’)”> </dtml-unless> <form action=”.” method=”post”> <table border=0 cellpadding=2 cellspacing=0 width=”100%”> <tr> <td colspan=5> <table border=”0” cellpadding=”0” cellspacing=”0” width=”100%”> <tr> <td align=”right”> <input type=”submit” name=”index_html:method” value=”View”> <select size=1 name=”SelectedGroup”> <option value=”All”>All Groups <dtml-in listGroups> <option value=”&dtml-sequence-item;”<dtml-if Æ SelectedGroup><dtml-if “_[‘sequence- Æ item’]==SelectedGroup”>selected</dtml-if></dtml-if>><dtml-var Æ sequence-item> Continued e4857-3 Ch10.F 3/1/02 9:40 AM Page 295 296 Part II ✦ Building Zope Products Listing 10-2 (continued) </dtml-in> </select> </td> </tr> </table> </td> </tr> <tr> <td colspan=5> <p align=center> <dtml-in “listEntriesByGroup(_[‘SelectedGroup’])” Æ previous size=20 start=start sort_expr=”sort_by”> <dtml-in previous-batches mapping> [<a href=”&dtml-absolute_url;?start=&dtml-batch-start- Æ number;&sort_by=&dtml-sort_by;&SelectedGroup=&dtml- Æ SelectedGroup;”><dtml-var batch-start-number> - Æ <dtml-var batch-end-number></a>] </dtml-in> </dtml-in> <dtml-in “listEntriesByGroup(_[‘SelectedGroup’])” Æ size=20 start=start sort_expr=”sort_by”> <dtml-if sequence-start> [<dtml-var expr=”_[‘sequence-index’]+1”> - </dtml-if> <dtml-if sequence-end> <dtml-var expr=”_[‘sequence-index’]+1”>] </dtml-if> </dtml-in> <dtml-in “listEntriesByGroup(_[‘SelectedGroup’])” next size=20 start=start sort_expr=”sort_by”> <dtml-in next-batches mapping> [<a href=”&dtml-absolute_url;?start=&dtml-batch-start- Æ number;&sort_by=&dtml-sort_by;&SelectedGroup=&dtml- Æ SelectedGroup;”><dtml-var batch-start-number> - Æ <dtml-var batch-end-number></a>] </dtml-in> </dtml-in> </p> </td> </tr> <tr> <th><a href=”&dtml-absolute_url;?sort_by=LastName,FirstName, Æ MiddleInitial&SelectedGroup=&dtml-SelectedGroup;”>Name</a></th> <th><a href=”&dtml-absolute_url;?sort_by= Æ Title&SelectedGroup=&dtml- SelectedGroup;”>Title</a></th> <th><a href=”&dtml- absolute_url;?sort_by=Company&SelectedGroup=&dtml- Æ e4857-3 Ch10.F 3/1/02 9:40 AM Page 296 297 Chapter 10 ✦ Creating a Multi-User AddressBook SelectedGroup;”>Company</a></th> <td>&nbsp;</td> </tr> <dtml-in “listEntriesByGroup(_[‘SelectedGroup’]) Æ “ size=20 start=start sort_expr=”sort_by”> <tr <dtml-if sequence-even>bgcolor=”#CCCCCC”</dtml-if>> <td><a href=”&dtml-absolute_url;”><dtml-var title></td> <td><dtml-var Title>&nbsp;</td> <td><dtml-var Company>&nbsp;</td> <td><a href=”&dtml- absolute_url;/editEntryForm”>Edit</a></td> </tr> </dtml-in> </form> </table> <dtml-var standard_html_footer> This code is very similar (but not identical) to the equivalent method for an AddressBook. Basically, the differences are that this screen does not have the con- trols for adding or deleting Entries directly, and it uses a <dtml-var absolute_url> to correctly construct the links to the Entries (and their edit screens) inside their respective AddressBooks. (This is also why we took such care to wrap the entries with the AddressBooks from which they came in the Addressit class’s listEntries ByGroup method; otherwise, absolute_url wouldn’t work correctly.) And we’ve removed the standard_addressbook_header. Now, you can refresh the Addressit product, and try instantiating some objects! Adding AddressBooks Adding an Addressit object is just like adding an AddressBook. Choose Addressit from the drop-down menu, and fill in the resulting form with the id of test. Click the Add Addressit button. You are returned to the folder to which you added the Addressit, so click on the test object to see its management screen, which should look like the one shown in Figure 10-1. As you can see, the interface looks like an ordinary folder, except that in place of a drop-down box to add objects, only an Add AddressBook button appears. This is because AddressBooks are the only type of object that can be added to the Addressit object, and the Zope management interface detects that only one kind of object is addable, so it displays a button instead of a drop-down. e4857-3 Ch10.F 3/1/02 9:40 AM Page 297 298 Part II ✦ Building Zope Products Figure 10-1: The Addressit Management Interface Add a couple of AddressBooks to the Addressit (call them 01 and 02), and you see them listed in the interface, just like an ordinary folder, as shown in Figure 10-2. You can see that the Addressbooks are displayed here much as they would be in an ordinary folder. Clicking through to the individual AddressBooks reveals the usual management interface for the Addressbooks, and clicking through the View tab reveals the normal user interface for the AddressBook. (Hah! I could tell you thought I was going to pull out another screenshot!). Go ahead and add some entries and some groups to each AddressBook (give each AddressBook a Musician group), and assign some of the Entries to groups. Now that you’ve populated the AddressBooks with users and groups, you can check out the Addressit’s user interface. Click on the View tab in the Addressit object to see how the AddressBook contents are being aggregated. You should see something similar to the view shown in Figure 10-3. e4857-3 Ch10.F 3/1/02 9:40 AM Page 298 299 Chapter 10 ✦ Creating a Multi-User AddressBook Figure 10-2: The Addressit Management Interface, with two AddressBook instances Figure 10-3: The Addressit index_html view e4857-3 Ch10.F 3/1/02 9:40 AM Page 299 300 Part II ✦ Building Zope Products As you can see from the screenshot, the Musicians group name appears twice. This is because a Musicians group is defined in each AddressBook. Oops. The solution is simple: Eliminate duplicates from the Group list. Edit the Addressit class’s listGroups method (not the AddressBook class’s!) to read as follows: def listGroups(self): “Returns a list of Groups from all AddressBooks” AllGroups = [‘Unfiled’] for Object in self.objectValues(): for Group in Object.listGroups(): if Group in AllGroups: continue AllGroups.append(Group) return AllGroups What we’ve changed here is the comparison operation in the innermost loop. Whereas before it was checking to see if the Group in question was another Unfiled group, now it only checks to see if the group already exists in the AllGroups list, and if so, it skips appending it. You can see the result in Figure 10-4. Figure 10-4: The Addressit index_html View, with redundant groups eliminated e4857-3 Ch10.F 3/1/02 9:40 AM Page 300 301 Chapter 10 ✦ Creating a Multi-User AddressBook Public and Private AddressBooks At this point, the Addressit folder can aggregate any AddressBooks within it into a single navigable interface. However, it is doing so indiscriminately, which wasn’t quite what we wanted. We wanted a user’s private AddressBook to be seamlessly merged into a single view with any public AddressBooks. Adding a Public attribute to the AddressBook class The first step to getting this working is to add a Public attribute to the AddressBook class that defaults to off. First, edit the AddressBook.py file as follows. Add a Public variable to the __init__: def __init__(self, id, title): self.id = id self.title = title self.ContactTypeList = [‘Email’, ‘Home’, ‘Mobile’, ‘Work’, ‘Pager’, ‘ICQ/IM’, ‘URL’, ‘Extension’] self.Entries = {} self.LastEntryID = 0 self.GroupList = [‘Unfiled’] self.Public = 0 Next, change the editAddressBook method to change the value of the property depending on when the box is checked: def editAddressBook(self, title, REQUEST, Public = None): “A method to edit Address Book Properties” self.title = title self.Public = Public Edit the mainAddressBook.dtml as follows: <dtml-var manage_page_header> <dtml-var manage_tabs> <form method=post action=editAddressBook> <table border=0 cellspacing=0 cellpadding=5> <tr> <td>Title:</td> <td><input type=text name=”title” value=”&dtml-title;”></td> </tr> <tr> <td>Public:</td> e4857-3 Ch10.F 3/1/02 9:40 AM Page 301 302 Part II ✦ Building Zope Products <td><input type=”checkbox” name=”Public” <dtml-if Æ Public>checked=”checked”</dtml-if>></td> </tr> <tr> <td colspan=2><input type=submit value=”Edit AddressBook”></td> </tr> </table> </form> </body> </html> <dtml-var manage_page_footer> Using the Public attribute In order to use the Public attribute to control the visibility of the AddressBooks, you need to change the Addressit class’s listEntriesByGroup and listGroups methods to skip non-public AddressBook instances, so edit those two Addressit.py methods as follows: def listGroups(self): “”” Returns a list of Groups from AddressBooks “”” AllGroups = [‘Unfiled’] for Object in self.objectValues(): if not Object.Public: continue for Group in Object.listGroups(): if Group in AllGroups: continue AllGroups.append(Group) return AllGroups def listEntriesByGroup(self, group = “All”): “”” Returns Entries from AddressBooks that match the Group “”” AllEntries = [] for Object in self.objectValues(): if not Object.Public: continue for Entry in Object.listEntriesByGroup(group=group): WrappedEntry = Entry.__of__(Object) AllEntries.append(WrappedEntry) return AllEntries e4857-3 Ch10.F 3/1/02 9:40 AM Page 302 303 Chapter 10 ✦ Creating a Multi-User AddressBook Save the changes you’ve made to all three files, and refresh the product. Edit each AddressBook management interface at least once (whether you set the Public prop- erty on or off), in order to create and set the Public property; otherwise, you get an error when you view the Addressit because listEntriesbyGroup and listGroups both expect AddressBook instances to have a Public property. You can now test your Addressit. Which AddressBooks are incorporated into the Addressit View depends on which have their Public property set. Incorporating the user’s private AddressBooks Aggregating all public AddressBooks still isn’t quite what we want. We also want the user’s personal AddressBook to be merged into the public ones when they’re view- ing the Addressit object, even though it’s not set to be public. The trick is to figure out how to distinguish which AddressBooks belong to the par- ticular user viewing the page. Fortunately, Zope has a fairly well developed security system that we can leverage. We can simply check for AddressBook objects that the user has a certain role for. We can choose one of two roles, Owner or Manager, to make the distinction. Either will work, but there are tradeoffs. The Manager role is currently the role that has the Manage AddressBook permission, which enables the user to add, edit, and delete Entries and groups. So it’s easy to detect this role in determining whether to include a non-public AddressBook in the aggregation. On the other hand, the Owner role is a bit of a more natural fit, because we are looking for Addressbooks that are Owned by the current user. The decision in this case becomes simpler when you realize that the user is unlikely to have an Owner role on an AddressBook unless he or she instantiated it himself or herself, whereas a Manager role is a prerequisite to being able to use the AddressBook at all. Therefore, we’ll go with the Manager role. So, we need to edit the listGroups and listEntriesByGroup methods in the Addressit class as follows: def listGroups(self): “”” Returns a list of Groups from all AddressBooks “”” AllGroups = [‘Unfiled’] for Object in self.objectValues(): if not Object.Public: if not self.REQUEST.AUTHENTICATED_USER.has_role([‘Manager’], Æ Object): continue for Group in Object.listGroups(): if Group in AllGroups: continue AllGroups.append(Group) return AllGroups e4857-3 Ch10.F 3/1/02 9:40 AM Page 303 304 Part II ✦ Building Zope Products def listEntriesByGroup(self, group = “All”): “”” Returns Entries from all AddressBooks that match the Group “”” AllEntries = [] for Object in self.objectValues(): if not Object.Public: if not self.REQUEST.AUTHENTICATED_USER.has_role([‘Manager’], Æ Object): continue for Entry in Object.listEntriesByGroup(group=group): WrappedEntry = Entry.__of__(Object) AllEntries.append(WrappedEntry) return AllEntries After making this change, a user will be presented with an aggregated view only of public AddressBooks and ones that the user has a Manager role on. Unfortunately, we don’t actually have a way of giving a user the manager role, because AddressBooks don’t yet have a security tab. We can fix that too by changing the manage_options class property (which defines what tabs are displayed in the management view) of the AddressBook class (in AddressBook.py) from: manage_options=( {‘label’:’Edit’, ‘action’:’manage_main’ }, {‘label’:’View’, ‘action’:’index_html’} ) To the following: manage_options=( {‘label’:’Edit’, ‘action’:’manage_main’ }, {‘label’:’View’, ‘action’:’index_html’} )+SimpleItem.manage_options This causes the AddressBook class to not simply override the SimpleItem’s class attribute with its own tabs, but to extend them instead. As the SimpleItem class adds the RoleManager class’s Security tab to the Item class’s History and Undo tabs, the AddressBook now has all of these, in addition to the Edit and View tabs defined in the AddressBook class itself. In any case, after refreshing the product, you will find that the AddressBook manage- ment interface now has all the above-mentioned tabs, and that the security tab (which has a local-roles interface) enables you to assign a user a local role of Manager on an AddressBook to a user. Furthermore, the Addressit object now dis- plays in a single aggregated view all public AddressBooks and whatever non-public AddressBooks the user has management privileges on. The user of course has to be authenticated (logged in) in order for this to work. e4857-3 Ch10.F 3/1/02 9:40 AM Page 304 [...]... look at themselves at all when searching for attributes, as they are considered attributes of their containers Thus, The index_html method is acquired by the Demo Folder, and looks for the standard_html_header object starting from the Demo Folder as well, acquiring it from the Root Folder The standard header then looks for the id property, again starting from the acquisition context, and finds it there... append the appropriate URL to the e-mail, and send the e-mail to whomever is the site maintainer But there is another twist: Simply by overriding the maintainer_email property in a folder or subfolder, the e-mails for that whole section of the site will now go to someone else In this way, the basic functionality (Logic) of the e-mail form and action are acquired throughout the site, and only the destination... through the process of updating a Web site with the use a version Creating a version Creating a version is just like creating any other Zope object Go to the Content screen of any folder in Zope From the list of available objects, select Version Zope will prompt you for the id and optional Title of the new version When finished, click the Add button Notice that the version you just added appears in the. .. to navigate their way around If they get deeper into the site and suddenly find that the visual clues they came to rely on have changed, they could easily get lost The job of the content manager then is to enforce some set of rules on the Web site’s appearance Sometimes this can be as simple as merely setting up CSS (cascading style sheets) in the proper places and making sure that all of the authors... )+SimpleItem.manage_options You can see that we’ve added another key/value pair to the first dictionary in the manage_options tuple This first dictionary defines the Edit tab for the AddressBook object The new member of the dictionary has a key of help and the associated value is a two-member tuple The first of these members (Addressit) refers to the product directory that contains the appropriate help directory (you could... create a version called “Updates,” follow these steps: 1 While logged into Zope, select Version from the drop-down menu of addable objects 2 Zope displays the add version page Name your version “Updates” and set the title to “Navigation Updates.” Click the Add button 325 g4857-3 Ch11.F 3 26 3/1/02 9:40 AM Page 3 26 Part III ✦ Zope Management 3 Zope returns you to the Root Folder’s management screen and... Management Strategies Follow these steps to save or discard the Updates version: 1 From the Root Folder click on the version labeled “Updates.” 2 Zope displays the Join/Leave page Click the Save/Discard tab 3 If there are any changes to be saved Zope will give you a text widget where you can make a comment about the changes you’ve made If there are no changes to be made, Zope will inform you of this... update the actual HTML structure (for example, moving the image after the text) for a hundred pages or more Because the advantages of using CSS to control the appearance of your site are the same whether you use Zope or not, we won’t be using style sheets in the rest of this book, but we strongly recommend that you take a look at using style sheets for your sites The problem in our example is that the. .. wanted) The second member of the tuple (Addressit.stx) refers to the appropriate filename in the help directory If you now refresh the product, you’ll find that any AddressBook instances now have a help link on their Edit tabs that pops up the Zope help with the Addressit help document You can in this way add separate help topics for each tab you define in any of your objects Adding an Icon Zope icons... looked in the document first, and found the index_html id, rather than finding it from the acquisition context Using acquisition to standardize layout As we’ve already seen, index_html can be acquired from the root folder, and in turn acquires the standard header and footer methods This gives site designers a convenient place to standardize the layout of the entire site, as they can insert the elements . src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABCYAAANpCAIAAABYYK9fAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42u3dS4+k51338bvOxz73zLjHsccmxAw4JEKKhBCILEgkNpFQxCuAF8B7gi3LrGCBrEhICMTBiZIANk7iTDKZQ09XV9V917mexU99q59E6AmPPDixP5+F1e5DdU13L+qr6/pfV+Nb775bAAAAvBxNPwIAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAPh6N/X7vpwAAALwkVjkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACSHHwEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHH4EAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHL4EQAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAA/h/afgS/5Pb7faPR+F/+tF/kM3e73X6/L8uyLMvFYjGfz1er1Ww2K8tyOp1uNpvDw8PhcPjlL3/5ZTw9AAAkB58cu91uuVxeX18vFovZbNbv9x89erRYLJbL5XK5bDQaH3zwwfPnz4uiWK/X7Xa7KIrZbNbpdP7wD//QTw8AQHKgKHbr9Xq1Wq1Wq/V63Wg0Go1Gs9lMQmw2m+12mzWNZrM5Go32+/2DBw/ytdvtttFofOlLX3r33Xf/+Z//uaqqzWbTbrdbrdZut7u6ulosFv1+3w8ZAOBTq7Hf7/0Ufpm91I1Vu92uqqrExna7LW62S83n8+1222w2+/1+o9GoqipfmHfu9/vdbtdqtYqi2Gw2w+Ewn/Nf//Vfl5eXZVm+ePFitVpNp9Nut/vVr371j/7oj2ysAgCQHHzSkmO/3+edt99/+9M2m81iscgARr/f3 263 6/W6KIr1ep2v3e12u92uKIo8SN652WxarVbeaDQau92u0+kMBoOiKL7zne9k0ePg4OD8/Py999779re/vd1u/+Iv/uL4+FhyAAB8OtlY9ckpk6xUZBPUdrtdrVZphmaz2Ww2EwZpg8RDBjM2m02n01kul3m5v9lsms3mdrvd7/dVVQ0Gg2yy2m633W53u932er3ERq/Xy0MlMxqNxng8vr6+zoPMZrOHDx++9957+/3+m9/85te+9jW/IwAAycGvntRFVVXL5bIoiu12m/1OCY/dbjefz6uqajQai8ViOBxeXl6++uqrb7755nK5TI1k0KLRaFxfX/d6vel0mjjZ7/f573q9zlxHhjoajUa73V6v151OZ71ed7vd1WrVarU6nc7p6elkMmk0GpkA6Xa79+7du7q6+s///M/VapVEAQBAcvArkBl59b9arTabTT19URRFeiMrD/lvURT9fn+z2QwGgxTCwcHBkydPhsNhvrYoiqqqshKy3+8PDg7WN/JoOYFqt9s1Go1Op5Nxjk6ns9vt6sfM9rzRaNRutzebTfqkLMs333zzn/7pn4qiuLy8vLi48LsDAPgUchXgr0xmrNfrsiwnk8lkMpnNZpPJJOdB1WmREYtWq5XeaLVa7XY7W54Gg0G/3+90Oo1G48MPP9xsNk+fPl0sFq1WK8sRjUZjOBymQIbD4WAwODg46HQ6SY7sp8pHj46Out3ucDjMqkU+J0+g3W6Px+MMY6zX66qq7t27l1D54Q9/6JcIAPDpZJXjl1c2NeXg2uySyoR3hi5arVaz2cw79/t9lhry0frLs88qe6iy/Sn7oObzebPZzNhGs9nMRqm8kSWUTIZkP1WiJb3RarXKssyDpzTyCKvVqtvtttvt7K1KciRp7ty58+zZsw8//PB3f/d3/U4BACQHvyw2m81kMqljY7lc5rzaTEp0Op1Wq9Xr9dbr9Xw+TyoMBoPUQrPZHAwGs9ms1+vVm6bynpTGarUaDodZA8kseKoje6hWq1WmOOoRjl6v1 263 s6yR/VfFrcHxzITknYeHh1kVSQuVZfngwYMf/vCHH3zwQe7r8JsFAJAcfPwWi8WLFy/yin+1Wu33+9RFr9dLbDQajVymkW1LmdbISkVuzCjLstls1pPf6ZZOp1PvwhoOhzm3qriZ08jXpjTyhavVKrMZGQfP6koeJ32SeY+spTSbzWypGo1GGSLP8bt3794dDof5F925c8cvFwDg08Ysxy+X/X7/9OnTx48fJwba7XZOqi1uru2bz+eNRqMsyxxWm+WIoiiyjpGpjNyhkfu/W61WdltlNSOPmYWORqPR7XbTIfUESBYicthuHSRZ37g9TZ7AqB8woyYpltPT0zyBuoLu3btXFMW//du/+f0CAHwKWeX4mO12u8vLy8ePH//kJz9pNpv3798viqLX69X7mkajUTZEZSWhKIqqqsbjcTZHZSojJ+QuFot6r9RoNFqv1+PxONdurNfrfr+fWfN2u71YLLLNabFYJB4SJ/XYxnA4vH0Mbv0g3W431wVmNj0fyr6s9FKr1To4OEjAZCxkNptlb9W3vvWtL3/5yxk3BwBAcvDS5TK+b3zjG+++++7V1dXDhw+/8pWv1FuhItuT8jK9XlXodrtVVWWVIysM9XFSWW24vbKRCwGLm1s10jO5AbC4WazIR/NVy+Wy3W7PZrPMaWy32+FwmEWVzIGkSTJSUl81uL9xcHDQbrdHo9F0Os0M+mKxOD8/73Q6s9nsxz/+8YMHD/zqAQAkB/8b3nnnnW984xvz+fzzn//8n/7pn/Z6vSRBfTxUtidl41PeyLpEJjq22229YlCWZW4Q7/f7WXDIrEX6IesVqYXlctntdotb9/rlu+RDnU4nj5lvWl/6kQWW9XqdT87npzSyrpI5k2zHarVa9+7du 76+ Lm7OrdpsNnfv3l0sFn/zN3/zZ3/2Z7ebCgCATzwv/j428/l8NBp95Stf+b3f+716lKIen6hPhWq3251Op9vt5gCoXq+3XC5zvm0WJXa7XfY4HRwcNJvN7GgqbobC8zjr9bo+0LYoilarlTNwcyt5VjPyHCKrJYmc3CyejV673a7b7TabzQRGPVCeb5S7OJrN5sHBQeZPiqJYrVa5B7DX6/3kJz/5zne+0/jv+asAAJAcfGQODw//5E/+5M0336yPjs1QRH3gbHGz4pG0yK0aZVlmzSHBcHh4OBwOu93ucrlMRdSrItvtNpPi/X4/Z15l5CN7qHLdR2Y8kiiDwSCPmSewWq2ur6/rgfU8pRyNVW+jqpdZ6qtC6mo6Pj7OG8vlcr1en56e5nt973vf86sHAJAc/G94//33e71efcZUcbOTKq/gMyZR3AxqN5vNqqoajUYWEIbDYe7lmE6ny+UyR+VmGSSH6maLVOoiYxur1SpT6Vm12G630+k08xj5FvP5PCmy2Wyqqup2u4PBoNPp5AaPLGXkofK/6Zzsv8qOr6yTZIzk9PS0PnU36zB5nEePHmUAHQAAycHL9eTJk8x219MRtz9aLxdk71O/3+/3+7krYzabZfGhqqpOp7NYLKq. src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABCYAAANpCAIAAABYYK9fAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR42u3dS4+k51338bvOxz73zLjHsccmxAw4JEKKhBCILEgkNpFQxCuAF8B7gi3LrGCBrEhICMTBiZIANk7iTDKZQ09XV9V917mexU99q59E6AmPPDixP5+F1e5DdU13L+qr6/pfV+Nb775bAAAAvBxNPwIAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAPh6N/X7vpwAAALwkVjkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACSHHwEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHH4EAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHL4EQAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMAAJAcAAAAkgMAAJAcAACA5AAAAJAcAACA5AAAACQHAACA5AAAACQHAAAgOQAAACQHAAAgOQAAACQHAAAgOQAAAMkBAAAgOQAAAMkBAABIDgAAAMkBAABIDgAAQHIAAABIDgAAQHIAAACSAwAAQHIAAACSAwAAkBwAAACSAwAAkBwAAACSAwAAkBwAAIDkAAAAkBwAAIDkAAAAJAcAAIDkAAAAJAcAACA5AAAAJAcAACA5AAAAyQEAACA5AAAAyQEAAEgOAAAAyQEAAEgOAAAAyQEAAEgOAABAcgAAAEgOAABAcgAAAJIDAABAcgAAAJIDAACQHAAAAJIDAACQHAAAgOQAAACQHAAAgOQAAAAkBwAAgOQAAAAkBwAAgOQAAAAkBwAAIDkAAAAkBwAAIDkAAADJAQAAIDkAAADJAQAASA4AAADJAQAASA4AAEByAAAASA4AAEByAAAAkgMAAEByAAAAkgMA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. Manager, to make the distinction. Either will work, but there are tradeoffs. The Manager role is currently the role that has the Manage AddressBook permission, which enables the user to add,

Ngày đăng: 14/08/2014, 01:20