Page MenuHomeIn-Portal Phabricator

in-portal
No OneTemporary

File Metadata

Created
Tue, May 20, 6:11 AM

in-portal

Index: trunk/kernel/units/user_profile/user_profile_tp.php
===================================================================
--- trunk/kernel/units/user_profile/user_profile_tp.php (revision 8633)
+++ trunk/kernel/units/user_profile/user_profile_tp.php (revision 8634)
@@ -1,76 +1,127 @@
<?php
class UserProfileTagProcessor extends kDBTagProcessor {
function Field($params)
{
$profile_mapping = $this->getProfileMapping();
$field = $this->SelectParam($params, 'name,field');
if (isset($params['profile_field']) && $params['profile_field']) {
$params['name'] = $profile_mapping[$field];
$value = $this->Application->ProcessParsedTag('u.profile', 'Field', $params);
}
else {
- $profile_user_id = $this->Application->GetVar('user_id');
- if (!$profile_user_id) {
- // if none user_id given use current user id
- $profile_user_id = $this->Application->RecallVar('user_id');
- }
- $value = $this->recallUserProfileVar($profile_user_id, $field);
+ $value = $this->recallUserProfileVar($field);
}
if (isset($params['checked']) && $params['checked']) {
$checked_value = isset($params['value']) ? $params['value'] : 1;
$value = ($value == $checked_value) ? 'checked' : '';
}
return $value;
}
/**
+ * Returns user_id to view profile from (same as u:getPassedID)
+ *
+ * @return int
+ */
+ function getProfileUserID()
+ {
+ $profile_user_id = $this->Application->GetVar('user_id');
+ if (!$profile_user_id) {
+ // if none user_id given use current user id
+ $profile_user_id = $this->Application->RecallVar('user_id');
+ }
+
+ return $profile_user_id;
+ }
+
+ /**
* Allows to get persistent var from other user
*
* @param int $user_id
* @param string $var_name
* @return mixed
*/
- function recallUserProfileVar($user_id, $var_name)
+ function recallUserProfileVar($var_name, $user_id = null)
{
static $cached_vars = null;
if (!isset($cached_vars)) {
+ if (!isset($user_id)) {
+ $user_id = $this->getProfileUserID();
+ }
+
$sql = 'SELECT VariableValue, VariableName
FROM '.TABLE_PREFIX.'PersistantSessionData
WHERE (PortalUserId = '.$user_id.') AND (LENGTH(VariableValue) < 10)';
$cached_vars = $this->Conn->GetCol($sql, 'VariableName');
}
return isset($cached_vars[$var_name]) ? $cached_vars[$var_name] : false;
}
/**
* Returns mapping between persistent var name and user profile field
*
* @return Array
*/
function getProfileMapping()
{
$profile_mapping = Array (
'pp_firstname' => 'FirstName',
'pp_lastname' => 'LastName',
'pp_dob' => 'dob',
'pp_email' => 'Email',
'pp_phone' => 'Phone',
'pp_street' => 'Street',
'pp_city' => 'City',
'pp_state' => 'State',
'pp_zip' => 'Zip',
'pp_country' => 'Country',
);
return $profile_mapping;
}
+
+ /**
+ * Returns visible field count in user profile
+ *
+ * @param Array $params
+ * @return int
+ */
+ function ProfileFieldCount($params)
+ {
+ static $field_count = null;
+
+ if (!isset($field_count)) {
+ $profile_mapping = $this->getProfileMapping();
+ $field_count = 0;
+ foreach ($profile_mapping as $var_name => $field_name) {
+ if ($this->recallUserProfileVar($var_name) == 1) {
+ $field_count++;
+ }
+ }
+ }
+
+ return $field_count;
+ }
+
+ /**
+ * Allows to detect that not all fields were shown
+ *
+ * @param Array $params
+ * @return bool
+ */
+ function NotLastField($params)
+ {
+ $counter = (int)$this->Application->GetVar($params['counter']);
+
+ return $counter < $this->ProfileFieldCount();
+ }
}
?>
\ No newline at end of file
Property changes on: trunk/kernel/units/user_profile/user_profile_tp.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.2
\ No newline at end of property
+1.3
\ No newline at end of property
Index: trunk/themes/default2007/platform/my_account/my_preferences.tpl
===================================================================
--- trunk/themes/default2007/platform/my_account/my_preferences.tpl (revision 8633)
+++ trunk/themes/default2007/platform/my_account/my_preferences.tpl (revision 8634)
@@ -1,89 +1,92 @@
<inp2:m_RequireLogin login_template="platform/login/register"/>
<inp2:m_DefineElement name="sidebar">
<inp2:m_RenderElements
elements="
platform/elements/side_boxes/login,
"
design="blue_box"/>
</inp2:m_DefineElement>
<inp2:m_DefineElement name="content">
<inp2:m_include template="platform/elements/navigation_bar" titles="lu_title_MyAccount,lu_title_MyPreferences" templates="platform/my_account/my_account,platform/my_account/my_preferences"/>
<!-- my preferences -->
<inp2:m_RenderElement design="content_box">
<inp2:m_Capture to_var="header">
<inp2:m_phrase name="lu_title_MyPreferences"/>
</inp2:m_Capture>
<table>
<tr>
<inp2:m_ModuleInclude template="my_account/preferences_tab" in-portal_template="platform/my_account/preferences_tab"/>
</tr>
</table>
<br />
<strong>Profile</strong><br /><br />
<form method="post" action="<inp2:m_FormAction/>">
<table class="form-data fullwidth">
<tr>
<td style="width:140px">
<inp2:m_phrase name="lu_col_AccountInformation"/>
</td>
<td style="width:140px">
<inp2:m_phrase name="lu_col_CurrentValue"/>
</td>
<td>
<inp2:m_phrase name="lu_col_DisplayToPublic"/>
</td>
</tr>
<tr>
<td class="field-name"><inp2:m_phrase name="lu_fld_Login"/></td>
<td><inp2:u_Field field="Login"/></td>
<td class="field-value">&nbsp;</td>
</tr>
<tr>
<td colspan="3">
<div class="hor-line"><img src="<inp2:m_TemplatesBase module="In-Portal"/>img/s.gif" width="3" height="1" alt=""/><br /></div>
</td>
</tr>
<inp2:m_include template="platform/designs/preferences"/>
<inp2:m_RenderElement name="privacy_element" field="pp_firstname" title="lu_fld_FirstName"/>
<inp2:m_RenderElement name="privacy_element" field="pp_lastname" title="lu_fld_LastName"/>
<inp2:m_RenderElement name="privacy_element" field="pp_dob" title="lu_fld_BirthDay"/>
<inp2:m_RenderElement name="privacy_element" field="pp_email" title="lu_fld_Email"/>
<inp2:m_RenderElement name="privacy_element" field="pp_phone" title="lu_fld_Phone"/>
<inp2:m_RenderElement name="privacy_element" field="pp_street" title="lu_fld_Street"/>
<inp2:m_RenderElement name="privacy_element" field="pp_city" title="lu_fld_City"/>
<inp2:m_RenderElement name="privacy_element" field="pp_state" title="lu_fld_State"/>
<inp2:m_RenderElement name="privacy_element" field="pp_zip" title="lu_fld_Zip"/>
<inp2:m_RenderElement name="privacy_element" field="pp_country" title="lu_fld_Country" is_last="1"/>
<tr>
<td colspan="3">
<img src="<inp2:m_TemplatesBase module="In-Portal"/>img/grey_pix.gif" width="100%" height="1" align="absmiddle" alt="" />
</td>
</tr>
<tr>
<td>
&nbsp;
</td>
- <td>
+ <td colspan="2">
<br />
<input class="button" type="submit" name="events[user-profile][OnUpdate]" value="<inp2:m_Phrase label="lu_btn_Update"/>"/>
+
+ <a href="<inp2:u.current_ProfileLink template="platform/my_account/public_profile"/>"><inp2:m_phrase name="lu_btn_ViewYourProfile"/></a>
+
<br /><br />
</td>
</tr>
</table>
</form>
</inp2:m_RenderElement>
<!-- // my preferences -->
</inp2:m_DefineElement>
<inp2:m_include template="platform/designs/default_design" pass_params="1"/>
\ No newline at end of file
Property changes on: trunk/themes/default2007/platform/my_account/my_preferences.tpl
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.1
\ No newline at end of property
+1.2
\ No newline at end of property
Index: trunk/themes/default2007/platform/my_account/public_profile.tpl
===================================================================
--- trunk/themes/default2007/platform/my_account/public_profile.tpl (nonexistent)
+++ trunk/themes/default2007/platform/my_account/public_profile.tpl (revision 8634)
@@ -0,0 +1,72 @@
+<inp2:m_RequireLogin login_template="platform/login/register"/>
+<inp2:m_DefineElement name="sidebar">
+ <inp2:m_RenderElements
+ elements="
+ platform/elements/side_boxes/login,
+ platform/elements/side_boxes/search,
+ "
+ design="blue_box"/>
+</inp2:m_DefineElement>
+
+<inp2:m_DefineElement name="content">
+ <inp2:m_include template="platform/elements/navigation_bar" titles="lu_title_UserProfile" templates="platform/my_account/public_profile"/>
+
+ <!-- public profile -->
+ <inp2:m_RenderElement design="content_box">
+ <inp2:m_Capture to_var="header">
+ <inp2:m_phrase name="lu_title_UserProfile"/>
+ </inp2:m_Capture>
+
+ <table class="form-data fullwidth">
+ <tr>
+ <td class="field-name"><inp2:m_phrase name="lu_fld_Login"/></td>
+ <td class="field-value"><inp2:u.profile_Field field="Login"/></td>
+ </tr>
+
+ <inp2:m_if check="user-profile_ProfileFieldCount">
+ <tr>
+ <td colspan="3">
+ <div class="hor-line"><img src="<inp2:m_TemplatesBase module="In-Portal"/>img/s.gif" width="3" height="1" alt=""/><br /></div>
+ </td>
+ </tr>
+ </inp2:m_if>
+
+ <inp2:m_include template="platform/designs/preferences"/>
+
+ <inp2:m_RenderElement name="profile_element" field="pp_firstname" title="lu_fld_FirstName"/>
+ <inp2:m_RenderElement name="profile_element" field="pp_lastname" title="lu_fld_LastName"/>
+ <inp2:m_RenderElement name="profile_element" field="pp_dob" title="lu_fld_BirthDay"/>
+ <inp2:m_RenderElement name="profile_element" field="pp_email" title="lu_fld_Email"/>
+ <inp2:m_RenderElement name="profile_element" field="pp_phone" title="lu_fld_Phone"/>
+ <inp2:m_RenderElement name="profile_element" field="pp_street" title="lu_fld_Street"/>
+ <inp2:m_RenderElement name="profile_element" field="pp_city" title="lu_fld_City"/>
+ <inp2:m_RenderElement name="profile_element" field="pp_state" title="lu_fld_State"/>
+ <inp2:m_RenderElement name="profile_element" field="pp_zip" title="lu_fld_Zip"/>
+ <inp2:m_RenderElement name="profile_element" field="pp_country" title="lu_fld_Country"/>
+
+ <tr>
+ <td colspan="3">
+ <img src="<inp2:m_TemplatesBase module="In-Portal"/>img/grey_pix.gif" width="100%" height="1" align="absmiddle" alt="" />
+ </td>
+ </tr>
+ <tr>
+ <td style="width:140px">
+ &nbsp;
+ </td>
+ <td colspan="2">
+ <br />
+
+ send message
+<!-- <a href="<inp2:private-message_SendMessageLink template="inbulletin/private_messages/new_message"/>"><inp2:m_phrase name="lu_btn_SendMessage"/></a>-->
+
+ <br /><br />
+
+ </td>
+ </tr>
+ </table>
+ </inp2:m_RenderElement>
+ <!-- // public profile -->
+
+</inp2:m_DefineElement>
+
+<inp2:m_include template="platform/designs/default_design" pass_params="1"/>
\ No newline at end of file
Property changes on: trunk/themes/default2007/platform/my_account/public_profile.tpl
___________________________________________________________________
Added: cvs2svn:cvs-rev
## -0,0 +1 ##
+1.1
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Index: trunk/themes/default2007/platform/designs/preferences.tpl
===================================================================
--- trunk/themes/default2007/platform/designs/preferences.tpl (revision 8633)
+++ trunk/themes/default2007/platform/designs/preferences.tpl (revision 8634)
@@ -1,17 +1,35 @@
<inp2:m_DefineElement name="privacy_element">
<tr>
<td class="field-name"><inp2:m_phrase name="$title"/></td>
<td><inp2:user-profile_Field field="$field" profile_field="1"/></td>
<td class="field-value">
<input type="hidden" id="user_profile[<inp2:m_param name="field"/>]" name="user_profile[<inp2:m_param name="field"/>]" value="<inp2:user-profile_Field field="$field"/>"/>
<input type="checkbox" id="_cb_user_profile[<inp2:m_param name="field"/>]" <inp2:user-profile_Field field="$field" checked="checked" db="db"/> onchange="update_checkbox(this, document.getElementById('user_profile[<inp2:m_param name="field"/>]'));"/>
</td>
</tr>
<inp2:m_if check="m_ParamEquals" name="is_last" value="0">
<tr>
<td colspan="3">
<div class="hor-line"><img src="<inp2:m_TemplatesBase module="In-Portal"/>img/s.gif" width="3" height="1" alt=""/><br /></div>
</td>
</tr>
</inp2:m_if>
+</inp2:m_DefineElement>
+
+<inp2:m_DefineElement name="profile_element">
+ <inp2:m_if check="user-profile_Field" name="$field">
+ <inp2:m_inc param="fields_shown" by="1"/>
+ <tr>
+ <td class="field-name"><inp2:m_phrase name="$title"/></td>
+ <td class="field-value"><inp2:user-profile_Field field="$field" profile_field="1"/></td>
+ </tr>
+
+ <inp2:m_if check="user-profile_NotLastField" counter="fields_shown">
+ <tr>
+ <td colspan="3">
+ <div class="hor-line"><img src="<inp2:m_TemplatesBase module="In-Portal"/>img/s.gif" width="3" height="1" alt=""/><br /></div>
+ </td>
+ </tr>
+ </inp2:m_if>
+ </inp2:m_if>
</inp2:m_DefineElement>
\ No newline at end of file
Property changes on: trunk/themes/default2007/platform/designs/preferences.tpl
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.2
\ No newline at end of property
+1.3
\ No newline at end of property
Index: trunk/core/units/users/users_tag_processor.php
===================================================================
--- trunk/core/units/users/users_tag_processor.php (revision 8633)
+++ trunk/core/units/users/users_tag_processor.php (revision 8634)
@@ -1,213 +1,225 @@
<?php
class UsersTagProcessor extends kDBTagProcessor
{
function LogoutLink($params)
{
$pass = Array('pass' => 'all,m,u', 'u_event' => 'OnLogout', 'm_cat_id'=>0);
$logout_template = $this->SelectParam($params, 'template,t');
return $this->Application->HREF($logout_template, '', $pass);
}
function UseUsernames($params)
{
return $this->Application->ConfigValue('Email_As_Login') != 1;
}
function RegistrationEnabled($params)
{
return $this->Application->ConfigValue('User_Allow_New') != 2;
}
function SuggestRegister($params)
{
return !$this->Application->LoggedIn() && !$this->Application->ConfigValue('Comm_RequireLoginBeforeCheckout') && $this->RegistrationEnabled($params);
}
function ConfirmPasswordLink($params)
{
//global $m_var_list_update, $var_list_update, $objSession, $objConfig;
$template = "forgotpw_reset_result";
$tmp_user_id = $this->Application->RecallVar("tmp_user_id");
$saved_denerated_code = $this->Application->GetVar('saved_denerated_code');
if ($saved_denerated_code){
$code = $saved_denerated_code;
}
else {
$code = md5($this->GenerateCode());
$this->Application->SetVar('saved_denerated_code', $code);
}
$sql = 'UPDATE '.TABLE_PREFIX.'PortalUser SET PwResetConfirm="'.$code.'", PwRequestTime='.adodb_mktime().' WHERE PortalUserId='.$tmp_user_id;
$this->Conn->Query($sql);
$params = array_merge($params, array('pass'=>'m', 'user_key'=>$code));
$main_processor =& $this->Application->recallObject('m_TagProcessor');
return $main_processor->T($params);
}
function GenerateCode()
{
list($usec, $sec) = explode(" ",microtime());
$id_part_1 = substr($usec, 4, 4);
$id_part_2 = mt_rand(1,9);
$id_part_3 = substr($sec, 6, 4);
$digit_one = substr($id_part_1, 0, 1);
if ($digit_one == 0) {
$digit_one = mt_rand(1,9);
$id_part_1 = ereg_replace("^0","",$id_part_1);
$id_part_1=$digit_one.$id_part_1;
}
return $id_part_1.$id_part_2.$id_part_3;
}
function ForgottenPassword($params)
{
return $this->Application->GetVar('ForgottenPassword');
}
function TestCodeIsValid($params)
{
$passed_key = $this->Application->GetVar('user_key');
$user_object = &$this->Application->recallObject('u.forgot');
-
+
// used for error reporting only -> rewrite code + theme (by Alex)
$user_current_object = &$this->Application->recallObject('u', null, Array('skip_autoload' => true)); // TODO: change theme too
if (strlen(trim($passed_key)) == 0) {
$user_current_object->ErrorMsgs['code_is_not_valid'] = $this->Application->Phrase('lu_code_is_not_valid');
$user_current_object->FieldErrors['PwResetConfirm']['pseudo'] = 'code_is_not_valid';
return false;
}
if ($user_object->Load(array('PwResetConfirm'=>$passed_key))) {
$exp_time = $user_object->GetDBField('PwRequestTime') + 3600;
if ($exp_time > adodb_mktime())
{
} else {
$user_current_object->ErrorMsgs['code_expired'] = $this->Application->Phrase('lu_code_expired');
$user_current_object->FieldErrors['PwResetConfirm']['pseudo'] = 'code_expired';
return false;
}
}
else {
$user_current_object->ErrorMsgs['code_is_not_valid'] = $this->Application->Phrase('lu_code_is_not_valid');
$user_current_object->FieldErrors['PwResetConfirm']['pseudo'] = 'code_is_not_valid';
return false;
}
return true;
}
/**
* Returns sitem administrator email
*
* @param Array $params
* @return string
*/
function SiteAdminEmail($params)
{
return $this->Application->ConfigValue('Smtp_AdminMailFrom');
}
function AffiliatePaymentTypeChecked($params)
{
static $checked = false;
if( $this->Application->GetVar('PaymentTypeId') )
{
$apt_object =& $this->Application->recallObject('apt.active');
if( $this->Application->GetVar('PaymentTypeId') == $apt_object->GetDBField('PaymentTypeId') )
{
return 1;
}
else
{
return 0;
}
}
if(!$checked)
{
$checked = true;
return 1;
}
else
{
return 0;
}
}
function HasError($params)
{
$res = parent::HasError($params);
if($this->SelectParam($params,'field,fields') == 'any')
{
$res = $res || $this->Application->GetVar('MustAgreeToTerms'); // need to do it not put module fields into kernel ! (noticed by Alex)
$res = $res || $this->Application->GetVar('SSNRequiredError');
}
return $res;
}
/**
* Returns login name of user
*
* @param Array $params
*/
function LoginName($params)
{
$object =& $this->getObject($params);
return $object->GetID() != -1 ? $object->GetDBField('Login') : 'root';
}
-
+
function CookieUsername($params)
{
$submit_value = $this->Application->GetVar($params['submit_field']);
if ($submit_value !== false) {
return $submit_value;
}
-
+
$username = $this->Application->GetVar('save_username'); // from cookie
-
+
if ($username == 'super-root') {
$username = 'root';
}
return $username === false ? '' : $username;
}
/**
* Checks if user have one of required permissions
*
* @param Array $params
* @return bool
*/
function HasPermission($params)
{
$perm_helper =& $this->Application->recallObject('PermissionsHelper');
/* @var $perm_helper kPermissionsHelper */
return $perm_helper->TagPermissionCheck($params, 'u_HasPermission');
}
-
- }
+ /**
+ * Returns link to post author public profile
+ *
+ * @param Array $params
+ * @return string
+ */
+ function ProfileLink($params)
+ {
+ $object =& $this->getObject($params);
+ $params['user_id'] = $object->GetID();
+ return $this->Application->ProcessParsedTag('m', 'Link', $params);
+ }
+
+ }
?>
\ No newline at end of file
Property changes on: trunk/core/units/users/users_tag_processor.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.19
\ No newline at end of property
+1.20
\ No newline at end of property
Index: trunk/core/units/user_profile/user_profile_tp.php
===================================================================
--- trunk/core/units/user_profile/user_profile_tp.php (revision 8633)
+++ trunk/core/units/user_profile/user_profile_tp.php (revision 8634)
@@ -1,76 +1,127 @@
<?php
class UserProfileTagProcessor extends kDBTagProcessor {
function Field($params)
{
$profile_mapping = $this->getProfileMapping();
$field = $this->SelectParam($params, 'name,field');
if (isset($params['profile_field']) && $params['profile_field']) {
$params['name'] = $profile_mapping[$field];
$value = $this->Application->ProcessParsedTag('u.profile', 'Field', $params);
}
else {
- $profile_user_id = $this->Application->GetVar('user_id');
- if (!$profile_user_id) {
- // if none user_id given use current user id
- $profile_user_id = $this->Application->RecallVar('user_id');
- }
- $value = $this->recallUserProfileVar($profile_user_id, $field);
+ $value = $this->recallUserProfileVar($field);
}
if (isset($params['checked']) && $params['checked']) {
$checked_value = isset($params['value']) ? $params['value'] : 1;
$value = ($value == $checked_value) ? 'checked' : '';
}
return $value;
}
/**
+ * Returns user_id to view profile from (same as u:getPassedID)
+ *
+ * @return int
+ */
+ function getProfileUserID()
+ {
+ $profile_user_id = $this->Application->GetVar('user_id');
+ if (!$profile_user_id) {
+ // if none user_id given use current user id
+ $profile_user_id = $this->Application->RecallVar('user_id');
+ }
+
+ return $profile_user_id;
+ }
+
+ /**
* Allows to get persistent var from other user
*
* @param int $user_id
* @param string $var_name
* @return mixed
*/
- function recallUserProfileVar($user_id, $var_name)
+ function recallUserProfileVar($var_name, $user_id = null)
{
static $cached_vars = null;
if (!isset($cached_vars)) {
+ if (!isset($user_id)) {
+ $user_id = $this->getProfileUserID();
+ }
+
$sql = 'SELECT VariableValue, VariableName
FROM '.TABLE_PREFIX.'PersistantSessionData
WHERE (PortalUserId = '.$user_id.') AND (LENGTH(VariableValue) < 10)';
$cached_vars = $this->Conn->GetCol($sql, 'VariableName');
}
return isset($cached_vars[$var_name]) ? $cached_vars[$var_name] : false;
}
/**
* Returns mapping between persistent var name and user profile field
*
* @return Array
*/
function getProfileMapping()
{
$profile_mapping = Array (
'pp_firstname' => 'FirstName',
'pp_lastname' => 'LastName',
'pp_dob' => 'dob',
'pp_email' => 'Email',
'pp_phone' => 'Phone',
'pp_street' => 'Street',
'pp_city' => 'City',
'pp_state' => 'State',
'pp_zip' => 'Zip',
'pp_country' => 'Country',
);
return $profile_mapping;
}
+
+ /**
+ * Returns visible field count in user profile
+ *
+ * @param Array $params
+ * @return int
+ */
+ function ProfileFieldCount($params)
+ {
+ static $field_count = null;
+
+ if (!isset($field_count)) {
+ $profile_mapping = $this->getProfileMapping();
+ $field_count = 0;
+ foreach ($profile_mapping as $var_name => $field_name) {
+ if ($this->recallUserProfileVar($var_name) == 1) {
+ $field_count++;
+ }
+ }
+ }
+
+ return $field_count;
+ }
+
+ /**
+ * Allows to detect that not all fields were shown
+ *
+ * @param Array $params
+ * @return bool
+ */
+ function NotLastField($params)
+ {
+ $counter = (int)$this->Application->GetVar($params['counter']);
+
+ return $counter < $this->ProfileFieldCount();
+ }
}
?>
\ No newline at end of file
Property changes on: trunk/core/units/user_profile/user_profile_tp.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.2
\ No newline at end of property
+1.3
\ No newline at end of property

Event Timeline