Added basic group management, with many missing features.
This commit is contained in:
@@ -23,4 +23,56 @@ class DefaultController extends Controller
|
||||
'users' => $users,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/csoport_jelentkezok", name="KekRozsakAdminBundle_groupJoinRequests")
|
||||
* @Template()
|
||||
*/
|
||||
public function groupJoinRequestsAction()
|
||||
{
|
||||
$user = $this->get('security.context')->getToken()->getUser();
|
||||
$groupRepo = $this->getDoctrine()->getRepository('KekRozsakFrontBundle:Group');
|
||||
$myGroups = $groupRepo->findByLeader($user);
|
||||
|
||||
$request = $this->getRequest();
|
||||
if ($request->getMethod() == 'POST')
|
||||
{
|
||||
if ($request->request->has('group') && $request->request->has('user'))
|
||||
{
|
||||
$userRepo = $this->getDoctrine()->getRepository('KekRozsakSecurityBundle:User');
|
||||
$aUser = $userRepo->findOneById($request->request->get('user'));
|
||||
$aGroup = $groupRepo->findOneById($request->request->get('group'));
|
||||
if ($aUser && $aGroup)
|
||||
{
|
||||
$membershipRepo = $this->getDoctrine()->getRepository('KekRozsakFrontBundle:UserGroupMembership');
|
||||
$membershipObject = $membershipRepo->findOneBy(array('user' => $aUser, 'group' => $aGroup));
|
||||
if ($membershipObject)
|
||||
{
|
||||
$membershipObject->setMembershipAcceptedAt(new \DateTime('now'));
|
||||
$membershipObject->setMembershipAcceptedBy($user);
|
||||
|
||||
$em = $this->getDoctrine()->getEntityManager();
|
||||
$em->persist($membershipObject);
|
||||
$em->flush();
|
||||
|
||||
return $this->redirect($this->generateUrl('KekRozsakAdminBundle_groupJoinRequests'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return array(
|
||||
'groups' => $myGroups,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/csoport_jelentkezok/elutasit", name="KekRozsakAdminBundle_groupJoinDecline")
|
||||
* @Template()
|
||||
*/
|
||||
public function groupJoinDeclineAction()
|
||||
{
|
||||
return array(
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,41 @@
|
||||
{% extends '::main_template.html.twig' %}
|
||||
{% block title %} - Csoport jelentkezők {% endblock %}
|
||||
{% block content %}
|
||||
<h3>Csoport jelentkezők</h3>
|
||||
<p>Az alábbi listán az általad vezetett csoportokba frissen jelentkezőket láthatod. A mellettük lévő ikonokra kattintva hagyhatod jóvá, illetve utasísthatod el a jelentkezésüket. Amennyiben ez utóbbi mellett döntesz, egy rövid üzenetet is írnod kell az elutasítás okáról.</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<td colspan="2">Csoport / Jelentkező</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for group in groups %}
|
||||
<tr>
|
||||
<td class="ikon">[ikon]</td>
|
||||
<td colspan="2">{{ group.name }}</td>
|
||||
</tr>
|
||||
{% for request in group.members %}
|
||||
{% if not group.isMember(request.user) %}
|
||||
<tr>
|
||||
<td colspan="2">{{ request.user.displayName }}</td>
|
||||
<td>
|
||||
<form method="post" action="{{ path('KekRozsakAdminBundle_groupJoinRequests') }}">
|
||||
<input type="hidden" name="user" value="{{ request.user.id }}" />
|
||||
<input type="hidden" name="group" value="{{ group.id }}" />
|
||||
<button type="submit">[jóváhagyó ikon]</button>
|
||||
</form>
|
||||
<form method="post" action="{{ path('KekRozsakAdminBundle_groupJoinDecline') }}">
|
||||
<input type="hidden" name="user" value="{{ request.user.id }}" />
|
||||
<input type="hidden" name="group" value="{{ group.id }}" />
|
||||
<button type="submit">[elutasító ikon]</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock content %}
|
@@ -6,7 +6,9 @@ use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
|
||||
|
||||
use KekRozsak\FrontBundle\Entity\UserGroupMembership;
|
||||
use KekRozsak\FrontBundle\Entity\UserData;
|
||||
|
||||
use KekRozsak\SecurityBundle\Form\Type\UserType;
|
||||
|
||||
class DefaultController extends Controller
|
||||
@@ -75,4 +77,77 @@ class DefaultController extends Controller
|
||||
'saveSuccess' => $saveSuccess,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/csoportok", name="KekRozsakFrontBundle_groupList")
|
||||
* @Template()
|
||||
*/
|
||||
public function groupListAction()
|
||||
{
|
||||
$groupRepo = $this->getDoctrine()->getRepository('KekRozsakFrontBundle:Group');
|
||||
$groups = $groupRepo->findAll(array('name' => 'DESC'));
|
||||
return array(
|
||||
'groups' => $groups,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/csoport/{groupSlug}/belepes", name="KekRozsakFrontBundle_groupJoin")
|
||||
* @Template()
|
||||
*/
|
||||
public function groupJoinAction($groupSlug)
|
||||
{
|
||||
$user = $this->get('security.context')->getToken()->getUser();
|
||||
$groupRepo = $this->getDoctrine()->getRepository('KekRozsakFrontBundle:Group');
|
||||
if (!($group = $groupRepo->findOneBySlug($groupSlug)))
|
||||
throw $this->createNotFoundException('A kért csoport nem létezik!');
|
||||
|
||||
if ($group->isMember($user))
|
||||
{
|
||||
return $this->redirect($this->generateUrl('KekRozsakFrontBundle_groupView', array($groupSlug => $group->getSlug())));
|
||||
}
|
||||
|
||||
if ($group->isRequested($user))
|
||||
{
|
||||
return array(
|
||||
'isRequested' => true,
|
||||
'needApproval' => false,
|
||||
'group' => $group,
|
||||
);
|
||||
}
|
||||
|
||||
$membership = new UserGroupMembership();
|
||||
$membership->setUser($user);
|
||||
$membership->setGroup($group);
|
||||
$membership->setMembershipRequestedAt(new \DateTime('now'));
|
||||
if ($group->isOpen())
|
||||
{
|
||||
$membership->setMembershipAcceptedAt(new \DateTime('now'));
|
||||
}
|
||||
|
||||
$em = $this->getDoctrine()->getEntityManager();
|
||||
$em->persist($membership);
|
||||
$em->flush();
|
||||
|
||||
if ($group->isOpen())
|
||||
{
|
||||
return $this->redirect($this->generateUrl('KekRozsakFrontBundle_groupView', array($groupSlug => $group->getSlug())));
|
||||
}
|
||||
else
|
||||
{
|
||||
$message = \Swift_Message::newInstance()
|
||||
->setSubject('Új jelentkező a csoportodban (' . $group->getName() . '): ' . $user->getDisplayName())
|
||||
// TODO: Make this a config parameter!
|
||||
->setFrom('info@blueroses.hu')
|
||||
->setTo($group->getLeader()->getEmail())
|
||||
->setBody($this->renderView('KekRozsakFrontBundle:Email:groupJoinRequest.txt.twig', array('user' => $user, 'group' => $group)));
|
||||
$this->get('mailer')->send($message);
|
||||
|
||||
return array(
|
||||
'isRequested' => false,
|
||||
'needApproval' => true,
|
||||
'group' => $group,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -205,4 +205,99 @@ class Group
|
||||
{
|
||||
return $this->members;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user is a member of this Group
|
||||
*
|
||||
* @param KekRozsak\SecurityBundle\Entity\User $user
|
||||
* @return boolean
|
||||
*/
|
||||
public function isMember(\KekRozsak\SecurityBundle\Entity\User $user)
|
||||
{
|
||||
return ($this->members->filter(
|
||||
function ($groupMembership) use ($user) {
|
||||
return (
|
||||
($groupMembership->getUser() == $user)
|
||||
&& (
|
||||
$groupMembership->getGroup()->isOpen()
|
||||
|| ($groupMembership->getMembershipAcceptedAt() !== null)
|
||||
)
|
||||
);
|
||||
}
|
||||
)->count() > 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user already requested a membership in this Group
|
||||
*
|
||||
* @param KekRozsak\SecurityBundle\Entity\User $user
|
||||
* @return boolean
|
||||
*/
|
||||
public function isRequested(\KekRozsak\SecurityBundle\Entity\User $user)
|
||||
{
|
||||
return ($this->members->filter(
|
||||
function ($groupMembership) use ($user) {
|
||||
return (
|
||||
($groupMembership->getUser() == $user)
|
||||
&& ($groupMembership->getMembershipRequestedAt() !== null)
|
||||
);
|
||||
}
|
||||
)->count() > 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @var string description
|
||||
* @ORM\Column(type="text", nullable=true)
|
||||
*/
|
||||
protected $description;
|
||||
|
||||
/**
|
||||
* Set description
|
||||
*
|
||||
* @param string $description
|
||||
* @return Group
|
||||
*/
|
||||
public function setDescription($description = null)
|
||||
{
|
||||
$this->description = $description;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get description
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return $this->description;
|
||||
}
|
||||
|
||||
/**
|
||||
* @var boolean open
|
||||
* @ORM\Column(type="boolean", nullable=false)
|
||||
*/
|
||||
protected $open;
|
||||
|
||||
/**
|
||||
* Set open
|
||||
*
|
||||
* @param boolean $open
|
||||
* @ return Group
|
||||
*/
|
||||
public function setOpen($open = false)
|
||||
{
|
||||
$this->open = $open;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get open
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function isOpen()
|
||||
{
|
||||
return $this->open;
|
||||
}
|
||||
}
|
||||
|
@@ -90,4 +90,89 @@ class UserGroupMembership
|
||||
{
|
||||
return $this->group;
|
||||
}
|
||||
|
||||
/**
|
||||
* @var DateTime $membershipRequestedAt
|
||||
* @ORM\Column(type="datetime", name="membership_requested_at")
|
||||
*/
|
||||
protected $membershipRequestedAt;
|
||||
|
||||
/**
|
||||
* Set membershipRequestedAt
|
||||
*
|
||||
* @param DateTime $membershipRequestedAt
|
||||
* @return UserGroupMembership
|
||||
*/
|
||||
public function setMembershipRequestedAt(\DateTime $membershipRequestedAt)
|
||||
{
|
||||
$this->membershipRequestedAt = $membershipRequestedAt;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get membershipRequestedAt
|
||||
*
|
||||
* @return DateTime
|
||||
*/
|
||||
public function getMembershipRequestedAt()
|
||||
{
|
||||
return $this->membershipRequestedAt;
|
||||
}
|
||||
|
||||
/**
|
||||
* @var DateTime membershipAcceptedAt
|
||||
* @ORM\Column(type="datetime", nullable=true, name="membership_accepted_at")
|
||||
*/
|
||||
protected $membershipAcceptedAt;
|
||||
|
||||
/**
|
||||
* Set membershipAcceptedAt
|
||||
*
|
||||
* @param DateTime $membershipAcceptedAt
|
||||
* @return UserGroupMembership
|
||||
*/
|
||||
public function setMembershipAcceptedAt(\DateTime $membershipAcceptedAt = null)
|
||||
{
|
||||
$this->membershipAcceptedAt = $membershipAcceptedAt;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get membershipAcceptedAt
|
||||
*
|
||||
* @return DateTime
|
||||
*/
|
||||
public function getMembershipAcceptedAt()
|
||||
{
|
||||
return $this->membershipAcceptedAt;
|
||||
}
|
||||
|
||||
/**
|
||||
* @var KekRozsak\SecurityBundle\Entity\User $membershipAcceptedBy
|
||||
* @ORM\ManyToOne(targetEntity="KekRozsak\SecurityBundle\Entity\User")
|
||||
* @ORM\JoinColumn(name="membership_accepted_by_id")
|
||||
*/
|
||||
protected $membershipAcceptedBy;
|
||||
|
||||
/**
|
||||
* Set membershipAcceptedBy
|
||||
*
|
||||
* @param KekRozsak\SecurityBundle\Entity\User
|
||||
* @return UserGroupMembership
|
||||
*/
|
||||
public function setMembershipAcceptedBy(\KekRozsak\SecurityBundle\Entity\User $membershipAcceptedBy = null)
|
||||
{
|
||||
$this->membershipAcceptedBy = $membershipAcceptedBy;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get membershipAcceptedBy
|
||||
*
|
||||
* @return KekRozsak\SecurityBundle\Entity\User
|
||||
*/
|
||||
public function getMembershipAcceptedBy()
|
||||
{
|
||||
return $this->membershipAcceptedBy;
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,11 @@
|
||||
{% extends '::main_template.html.twig' %}
|
||||
{% block title %} - Csoportok{% endblock title %}
|
||||
{% block content %}
|
||||
<h3>Jelentkezés</h3>
|
||||
{% if isRequested %}
|
||||
Már jelentkeztél ebbe a csoportba ({{ group.name }}), de {{ group.leader.displayName }} még nem hagyta jóvá a belépésedet.
|
||||
{% endif %}
|
||||
{% if needApproval %}
|
||||
A csoportba való jelentkezésedről a csoport vezetőjét ({{ group.leader.displayName }}) értesítettük.
|
||||
{% endif %}
|
||||
{% endblock content %}
|
@@ -0,0 +1,61 @@
|
||||
{% extends '::main_template.html.twig' %}
|
||||
{% block title %} - Csoportok{% endblock %}
|
||||
{% block content %}
|
||||
<h3>Csoportok</h3>
|
||||
<p>Az alábbi lista tartalmazza a Kék Rózsák összes jelenlegi csoportját. Bármelyikbe szabadon jelentkezhetsz, de az [ikon] ikonnal jelzettek esetén szükség van a csoport vezetőjének jóváhagyására is, míg a többi csoport esetén azonnal taggá válsz.</p>
|
||||
<p>Amennyiben nem találsz az érdeklődésednek megfelelő csoportot, létre is hozhatsz egyet Kérünk azonban, hogy tartsd szem előtt, hogy a hosszú ideig csak egy tagot számláló csoportokat a Vének bezárhatják, így a csoport létrehozása előtt mindenképpen tájékozódj, hogy van-e igény rá.</p>
|
||||
<p>Szintén fontos, hogy egy új csoport létrehozása nem tesz azonnal annak vezetőjévé, azt a csoport tagjainak meg kell szavazniuk, vagy a Véneknek jóváhagyniuk, hiszen a Kék Rózsák, ezáltal annak csoportjai is az egyenlőség elvén működnek.</p>
|
||||
<p>Amennyiben látni szeretnéd egy csoport leírását, kattints a csoport nevére!</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<td colspan="2">Csoport neve</td>
|
||||
<td>Státusz</td>
|
||||
<td>Vezető</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for group in groups %}
|
||||
<tr>
|
||||
<td>[ikon]</td>
|
||||
<td class="csoport" title="{{ group.description }}">{{ group.name }}</td>
|
||||
<td>
|
||||
{% if group.isMember(app.user) %}
|
||||
<span title="Már tag vagy" class="ikon">[tag ikon]</span>
|
||||
{% elseif group.isRequested(app.user) %}
|
||||
<span title="Már jelentkeztél, de a jelentkezésedet a csoport vezetője még nem fogadta el" class="ikon">[jelentkeztél ikon]</span>
|
||||
{% else %}
|
||||
{% if group.isOpen %}
|
||||
<a href="{{ path('KekRozsakFrontBundle_groupJoin, { groupSlug: group.slug }') }}"><span title="Nyílt csoport, kattints a belépéshez!" class="ikon">[nyílt ikon]</span></a>
|
||||
{% else %}
|
||||
<a href="{{ path('KekRozsakFrontBundle_groupJoin', { groupSlug: group.slug }) }}"><span title="Zárt csoport, kattints a jelentkezéshez!" class="ikon">[zárt ikon]</span></a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{% if group.leader %}{{ group.leader.displayName }}{% else %}Nincs{% endif %}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
Új csoport létrehozása
|
||||
{% endblock content %}
|
||||
{% block bottomscripts %}
|
||||
<script type="text/javascript">
|
||||
$('.csoport').tooltip({
|
||||
track: true,
|
||||
delay: 0,
|
||||
fade: 250
|
||||
});
|
||||
$('.ikon').tooltip({
|
||||
track: true,
|
||||
delay: 0,
|
||||
fade: 250
|
||||
});
|
||||
</script>
|
||||
{% endblock bottomscripts %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -0,0 +1,10 @@
|
||||
Kedves {{ group.leader.displayName }}!
|
||||
|
||||
{{ user.displayName }} szeretne csatlakozni az általad vezetett "{{ group.name }}" csoportba.
|
||||
|
||||
A csoportjaidba jelentkezők listáját ezen a linken érheted el:
|
||||
|
||||
{{ url('KekRozsakAdminBundle_groupJoinRequests') }}
|
||||
|
||||
Üdv,
|
||||
blueroses.hu
|
@@ -91,8 +91,10 @@ class DefaultController extends Controller
|
||||
|
||||
$message = \Swift_Message::newInstance()
|
||||
->setSubject('Új jelentkező')
|
||||
// TODO: Make this a config parameter!
|
||||
->setFrom('info@blueroses.hu')
|
||||
->setTo('info@blueroses.hu')
|
||||
// TODO: Make this a config parameter!
|
||||
->setTo('jelentkezes@blueroses.hu')
|
||||
->setBody($this->renderView('KekRozsakSecurityBundle:Email:new_registration.txt.twig', array('user' => $user)));
|
||||
$this->get('mailer')->send($message);
|
||||
|
||||
|
Reference in New Issue
Block a user