Simply flag a profile for review
Instead of trying to have lots of different flags on different objects, cut to the core of this functionality: flag a profile for moderator review.
This commit is contained in:
parent
d9cde0ef80
commit
55c7c943e7
@ -1,53 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2009, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET')) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
|
|
||||||
|
|
||||||
class Notice_flag extends Memcached_DataObject
|
|
||||||
{
|
|
||||||
###START_AUTOCODE
|
|
||||||
/* the code below is auto generated do not remove the above tag */
|
|
||||||
|
|
||||||
public $__table = 'notice_flag'; // table name
|
|
||||||
public $flag; // varchar(8) primary_key not_null
|
|
||||||
public $display; // varchar(255)
|
|
||||||
public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00
|
|
||||||
|
|
||||||
/* Static get */
|
|
||||||
function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice_flag',$k,$v); }
|
|
||||||
|
|
||||||
/* the code above is auto generated do not remove the tag below */
|
|
||||||
###END_AUTOCODE
|
|
||||||
|
|
||||||
function table() {
|
|
||||||
return array(
|
|
||||||
'flag' => DB_DATAOBJECT_STR,
|
|
||||||
'display' => DB_DATAOBJECT_STR,
|
|
||||||
'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function keys() {
|
|
||||||
return array('flag');
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,55 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2009, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET')) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
|
|
||||||
|
|
||||||
class Profile_flag extends Memcached_DataObject
|
|
||||||
{
|
|
||||||
###START_AUTOCODE
|
|
||||||
/* the code below is auto generated do not remove the above tag */
|
|
||||||
|
|
||||||
public $__table = 'profile_flag'; // table name
|
|
||||||
public $flag; // varchar(8) primary_key not_null
|
|
||||||
public $display; // varchar(255)
|
|
||||||
public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00
|
|
||||||
|
|
||||||
/* Static get */
|
|
||||||
function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Profile_flag',$k,$v); }
|
|
||||||
|
|
||||||
/* the code above is auto generated do not remove the tag below */
|
|
||||||
###END_AUTOCODE
|
|
||||||
|
|
||||||
const DEFAULTFLAG = 'review'; // default flag
|
|
||||||
|
|
||||||
function table() {
|
|
||||||
return array(
|
|
||||||
'flag' => DB_DATAOBJECT_STR,
|
|
||||||
'display' => DB_DATAOBJECT_STR,
|
|
||||||
'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function keys() {
|
|
||||||
return array('flag');
|
|
||||||
}
|
|
||||||
}
|
|
@ -47,22 +47,6 @@ class UserFlagPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
$schema = Schema::get();
|
$schema = Schema::get();
|
||||||
|
|
||||||
// For storing user-submitted flags on notices
|
|
||||||
|
|
||||||
$schema->ensureTable('user_flag_notice',
|
|
||||||
array(new ColumnDef('notice_id', 'integer', null, null, 'PRI'),
|
|
||||||
new ColumnDef('user_id', 'integer', null, null, 'PRI'),
|
|
||||||
new ColumnDef('flag', 'varchar', '8'),
|
|
||||||
new ColumnDef('created', 'datetime', null,
|
|
||||||
null, 'MUL')));
|
|
||||||
|
|
||||||
// Allowable values for user_flag_notice
|
|
||||||
|
|
||||||
$schema->ensureTable('notice_flag',
|
|
||||||
array(new ColumnDef('flag', 'varchar', '8', null, 'PRI'),
|
|
||||||
new ColumnDef('display', 'varchar', '255'),
|
|
||||||
new ColumnDef('created', 'datetime', null, null, 'MUL')));
|
|
||||||
|
|
||||||
// For storing user-submitted flags on profiles
|
// For storing user-submitted flags on profiles
|
||||||
|
|
||||||
$schema->ensureTable('user_flag_profile',
|
$schema->ensureTable('user_flag_profile',
|
||||||
@ -70,17 +54,11 @@ class UserFlagPlugin extends Plugin
|
|||||||
null, 'PRI'),
|
null, 'PRI'),
|
||||||
new ColumnDef('user_id', 'integer', null,
|
new ColumnDef('user_id', 'integer', null,
|
||||||
null, 'PRI'),
|
null, 'PRI'),
|
||||||
new ColumnDef('flag', 'varchar', '8'),
|
|
||||||
new ColumnDef('created', 'datetime', null,
|
new ColumnDef('created', 'datetime', null,
|
||||||
|
null, 'MUL'),
|
||||||
|
new ColumnDef('cleared', 'datetime', null,
|
||||||
null, 'MUL')));
|
null, 'MUL')));
|
||||||
|
|
||||||
// Allowable values for user_flag_notice
|
|
||||||
|
|
||||||
$schema->ensureTable('profile_flag',
|
|
||||||
array(new ColumnDef('flag', 'varchar', '8', null, 'PRI'),
|
|
||||||
new ColumnDef('display', 'varchar', '255'),
|
|
||||||
new ColumnDef('created', 'datetime', null,
|
|
||||||
null, 'MUL')));
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,9 +69,7 @@ class UserFlagPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onRouterInitialized(&$m) {
|
function onRouterInitialized(&$m) {
|
||||||
$m->connect('main/flag/notice', array('action' => 'flagnotice'));
|
|
||||||
$m->connect('main/flag/profile', array('action' => 'flagprofile'));
|
$m->connect('main/flag/profile', array('action' => 'flagprofile'));
|
||||||
$m->connect('admin/notice/flag', array('action' => 'adminnoticeflag'));
|
|
||||||
$m->connect('admin/profile/flag', array('action' => 'adminprofileflag'));
|
$m->connect('admin/profile/flag', array('action' => 'adminprofileflag'));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -102,19 +78,14 @@ class UserFlagPlugin extends Plugin
|
|||||||
{
|
{
|
||||||
switch ($cls)
|
switch ($cls)
|
||||||
{
|
{
|
||||||
case 'FlagnoticeAction':
|
|
||||||
case 'FlagprofileAction':
|
case 'FlagprofileAction':
|
||||||
case 'AdminnoticeflagAction':
|
|
||||||
case 'AdminprofileflagAction':
|
case 'AdminprofileflagAction':
|
||||||
require_once(INSTALLDIR.'/plugins/UserFlag/' . strtolower(mb_substr($cls, 0, -6)) . '.php');
|
require_once(INSTALLDIR.'/plugins/UserFlag/' . strtolower(mb_substr($cls, 0, -6)) . '.php');
|
||||||
return false;
|
return false;
|
||||||
case 'FlagProfileForm':
|
case 'FlagProfileForm':
|
||||||
require_once(INSTALLDIR.'/plugins/UserFlag/' . strtolower($cls . '.php'));
|
require_once(INSTALLDIR.'/plugins/UserFlag/' . strtolower($cls . '.php'));
|
||||||
return false;
|
return false;
|
||||||
case 'User_flag_notice':
|
|
||||||
case 'Notice_flag':
|
|
||||||
case 'User_flag_profile':
|
case 'User_flag_profile':
|
||||||
case 'Profile_flag':
|
|
||||||
require_once(INSTALLDIR.'/plugins/UserFlag/'.$cls.'.php');
|
require_once(INSTALLDIR.'/plugins/UserFlag/'.$cls.'.php');
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
|
@ -1,60 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2009, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET')) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
|
|
||||||
|
|
||||||
class User_flag_notice extends Memcached_DataObject
|
|
||||||
{
|
|
||||||
###START_AUTOCODE
|
|
||||||
/* the code below is auto generated do not remove the above tag */
|
|
||||||
|
|
||||||
public $__table = 'user_flag_notice'; // table name
|
|
||||||
public $notice_id; // int(4) primary_key not_null
|
|
||||||
public $user_id; // int(4) primary_key not_null
|
|
||||||
public $flag; // varchar(8)
|
|
||||||
public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00
|
|
||||||
|
|
||||||
/* Static get */
|
|
||||||
function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User_flag_notice',$k,$v); }
|
|
||||||
|
|
||||||
/* the code above is auto generated do not remove the tag below */
|
|
||||||
###END_AUTOCODE
|
|
||||||
|
|
||||||
function table() {
|
|
||||||
return array(
|
|
||||||
'notice_id' => DB_DATAOBJECT_INT,
|
|
||||||
'user_id' => DB_DATAOBJECT_INT,
|
|
||||||
'flag' => DB_DATAOBJECT_STR,
|
|
||||||
'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function keys() {
|
|
||||||
return array('notice_id', 'user_id');
|
|
||||||
}
|
|
||||||
|
|
||||||
function &pkeyGet($kv)
|
|
||||||
{
|
|
||||||
return Memcached_DataObject::pkeyGet('User_flag_notice', $kv);
|
|
||||||
}
|
|
||||||
}
|
|
@ -31,8 +31,8 @@ class User_flag_profile extends Memcached_DataObject
|
|||||||
public $__table = 'user_flag_profile'; // table name
|
public $__table = 'user_flag_profile'; // table name
|
||||||
public $profile_id; // int(4) primary_key not_null
|
public $profile_id; // int(4) primary_key not_null
|
||||||
public $user_id; // int(4) primary_key not_null
|
public $user_id; // int(4) primary_key not_null
|
||||||
public $flag; // varchar(8)
|
|
||||||
public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00
|
public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00
|
||||||
|
public $cleared; // datetime not_null default_0000-00-00%2000%3A00%3A00
|
||||||
|
|
||||||
/* Static get */
|
/* Static get */
|
||||||
function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User_flag_profile',$k,$v); }
|
function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User_flag_profile',$k,$v); }
|
||||||
@ -44,8 +44,8 @@ class User_flag_profile extends Memcached_DataObject
|
|||||||
return array(
|
return array(
|
||||||
'profile_id' => DB_DATAOBJECT_INT,
|
'profile_id' => DB_DATAOBJECT_INT,
|
||||||
'user_id' => DB_DATAOBJECT_INT,
|
'user_id' => DB_DATAOBJECT_INT,
|
||||||
'flag' => DB_DATAOBJECT_STR,
|
'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME,
|
||||||
'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME
|
'cleared' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ class User_flag_profile extends Memcached_DataObject
|
|||||||
return Memcached_DataObject::pkeyGet('User_flag_profile', $kv);
|
return Memcached_DataObject::pkeyGet('User_flag_profile', $kv);
|
||||||
}
|
}
|
||||||
|
|
||||||
static function exists($profile_id, $user_id, $flag)
|
static function exists($profile_id, $user_id)
|
||||||
{
|
{
|
||||||
$ufp = User_flag_profile::pkeyGet(array('profile_id' => $profile_id,
|
$ufp = User_flag_profile::pkeyGet(array('profile_id' => $profile_id,
|
||||||
'user_id' => $user_id));
|
'user_id' => $user_id));
|
||||||
|
@ -1,88 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Show latest and greatest notice flags
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2009, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET')) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show the latest and greatest notice flags
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
|
|
||||||
class AdminnoticeflagAction extends Action
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Take arguments for running
|
|
||||||
*
|
|
||||||
* @param array $args $_REQUEST args
|
|
||||||
*
|
|
||||||
* @return boolean success flag
|
|
||||||
*/
|
|
||||||
|
|
||||||
function prepare($args)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle request
|
|
||||||
*
|
|
||||||
* @param array $args $_REQUEST args; handled in prepare()
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
|
|
||||||
function handle($args)
|
|
||||||
{
|
|
||||||
parent::handle($args);
|
|
||||||
|
|
||||||
$this->showPage();
|
|
||||||
}
|
|
||||||
|
|
||||||
function title() {
|
|
||||||
return _('Flagged notices');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* save the notice flag
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
|
|
||||||
function showContent()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Add a flag to a notice
|
|
||||||
*
|
|
||||||
* PHP version 5
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*
|
|
||||||
* StatusNet - the distributed open-source microblogging tool
|
|
||||||
* Copyright (C) 2009, StatusNet, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!defined('STATUSNET')) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action to flag a notice.
|
|
||||||
*
|
|
||||||
* @category Action
|
|
||||||
* @package StatusNet
|
|
||||||
* @author Evan Prodromou <evan@status.net>
|
|
||||||
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
|
|
||||||
* @link http://status.net/
|
|
||||||
*/
|
|
||||||
|
|
||||||
class FlagnoticeAction extends Action
|
|
||||||
{
|
|
||||||
var $notice = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Take arguments for running
|
|
||||||
*
|
|
||||||
* @param array $args $_REQUEST args
|
|
||||||
*
|
|
||||||
* @return boolean success flag
|
|
||||||
*/
|
|
||||||
|
|
||||||
function prepare($args)
|
|
||||||
{
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
|
|
||||||
throw new ClientException(_('Action only accepts POST'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle request
|
|
||||||
*
|
|
||||||
* Shows a page with list of favorite notices
|
|
||||||
*
|
|
||||||
* @param array $args $_REQUEST args; handled in prepare()
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
|
|
||||||
function handle($args)
|
|
||||||
{
|
|
||||||
parent::handle($args);
|
|
||||||
|
|
||||||
$this->flagNotice();
|
|
||||||
$this->returnTo();
|
|
||||||
}
|
|
||||||
|
|
||||||
function title() {
|
|
||||||
return _('Flag notice');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* save the notice flag
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
|
|
||||||
function flagNotice()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -115,7 +115,7 @@ class FlagProfileForm extends Form
|
|||||||
*/
|
*/
|
||||||
function formLegend()
|
function formLegend()
|
||||||
{
|
{
|
||||||
$this->out->element('legend', null, _('Flag this profile'));
|
$this->out->element('legend', null, _('Flag profile for review'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -147,6 +147,6 @@ class FlagProfileForm extends Form
|
|||||||
|
|
||||||
function formActions()
|
function formActions()
|
||||||
{
|
{
|
||||||
$this->out->submit('submit', _('Flag'), 'submit', null, _('Flag this profile'));
|
$this->out->submit('submit', _('Flag'), 'submit', null, _('Flag profile for review'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user