Browse Source

implement kicking and banning users. fixes #81

Natenom/support-murmur-13-1446181288462
Michael Ziegler 14 years ago
parent
commit
e232a218fa
  1. 139
      pyweb/mumble/media/js/channelviewerplugins.js
  2. 4
      pyweb/mumble/models.py
  3. 9
      pyweb/mumble/templates/mumble/mumble.html
  4. 8
      pyweb/mumble/views.py

139
pyweb/mumble/media/js/channelviewerplugins.js

@ -0,0 +1,139 @@
// kate: space-indent on; indent-width 4; replace-tabs on;
Ext.namespace('Ext.ux');
Ext.ux.MumbleUserEditor = Ext.extend( Ext.Component, {
clickHandler: function( node, ev ){
if( typeof node.attributes.userdata != "undefined" ){
this.activate(node.attributes.userdata);
}
},
init: function( tree ){
this.tree = tree;
tree.on("click", this.clickHandler, this);
},
activate: function( userdata ){
if( !this.wnd ){
this.userdata = userdata;
this.wnd = new Ext.Window({
title: this.windowTitle || gettext("User details"),
layout: 'fit',
items: [{
xtype: "tabpanel",
activeTab: 0,
border: false,
items: [{
html: userdata.comment || gettext("No user comment set"),
title: gettext("User comment"),
}, {
title: gettext("Avatar"),
html: '<img src="http://www.gravatar.com/avatar/6a11052bfa1ae52aa63fc0001417158d.jpg?d=monsterid&s=80" />',
}, {
title: gettext("Infos"),
html: "<ul><li>admin: yes</li><li>registered: maybe</li></ul>",
}, {
xtype: "form",
border: false,
title: gettext("Kick/Ban"),
items: [{
xtype: "checkbox",
fieldLabel: gettext("Ban"),
name: "ban"
}, {
xtype: "numberfield",
fieldLabel: gettext("Ban duration"),
value: 3600,
name: "duration"
}, {
xtype: "label",
text: gettext("Only if banning. Set to 0 for permanent ban, any other value for the ban duration in seconds."),
cls: "form_hint_label",
}, {
xtype: "textfield",
fieldLabel: gettext("Reason"),
name: "reason"
}],
fbar: [{
scope: this,
text: gettext("Kick"),
handler: function(btn){
f = btn.ownerCt.ownerCt.getForm().getValues();
Mumble.kickUser(
this.serverid, this.userdata.session, f.reason, (f.ban || false), parseInt(f.duration)
);
}
}],
}],
}],
width: 500,
height: 300,
scope: this,
listeners: {
beforeclose: function(){
this.owner.wnd = null;
}
},
});
this.wnd.owner = this;
}
if( !this.wnd.isVisible() ){
this.wnd.show();
mypos = this.tree.getPosition();
mysize = this.tree.getSize();
this.wnd.setPosition( mypos[0] + mysize.width - 50, mypos[1] + 50 );
}
else{
this.wnd.close();
}
},
} );
Ext.ux.MumbleChannelEditor = Ext.extend( Ext.Component, {
clickHandler: function( node, ev ){
if( typeof node.attributes.chandata != "undefined" ){
this.activate(node.attributes.chandata);
}
},
init: function( tree ){
this.tree = tree;
tree.on("click", this.clickHandler, this);
},
activate: function( chandata ){
if( !this.wnd ){
this.wnd = new Ext.Window({
title: this.windowTitle || gettext("Channel details"),
layout: 'fit',
items: [{
xtype: "tabpanel",
activeTab: 0,
items: [{
html: chandata.description || gettext("No channel description set"),
title: gettext("Channel description"),
}],
}],
width: 500,
height: 300,
scope: this,
listeners: {
beforeclose: function(){
this.owner.wnd = null;
}
},
});
this.wnd.owner = this;
}
if( !this.wnd.isVisible() ){
this.wnd.show();
mypos = this.tree.getPosition();
mysize = this.tree.getSize();
this.wnd.setPosition( mypos[0] + mysize.width - 50, mypos[1] + 50 );
}
else{
this.wnd.close();
}
},
} );

4
pyweb/mumble/models.py

@ -554,8 +554,8 @@ class Mumble( models.Model ):
def kickUser( self, sessionid, reason="" ):
return self.ctl.kickUser( self.srvid, sessionid, reason )
def banUser( self, sessionid, reason="" ):
return self.ctl.addBanForSession( self.srvid, sessionid, reason=reason )
def banUser( self, sessionid, reason="", duration=0 ):
return self.ctl.addBanForSession( self.srvid, sessionid, reason=reason, duration=duration )
def moveUser( self, sessionid, channelid ):
return self.ctl.moveUser( self.srvid, sessionid, channelid )

9
pyweb/mumble/templates/mumble/mumble.html

@ -12,8 +12,9 @@
<script type="text/javascript" src="/mumble/forms/api.js"></script>
<script type="text/javascript" src="/mumble/forms/{{ RegForm|lower }}.js"></script>
<script type="text/javascript" src="/mumble/forms/mumbleform.js"></script>
<script type="text/javascript" src="{{ MUMBLE_MEDIA_PREFIX }}js/rendermumbleserver.js"></script>
<script type="text/javascript" src="{{ MUMBLE_MEDIA_PREFIX }}js/channelviewer.js"></script>
<script type="text/javascript" src="{{ MUMBLE_MEDIA_PREFIX }}js/channelviewerplugins.js"></script>
<script type="text/javascript" src="{{ MUMBLE_MEDIA_PREFIX }}js/rendermumbleserver.js"></script>
<script type="text/javascript" src="{{ MUMBLE_MEDIA_PREFIX }}js/usereditor.js"></script>
<script type="text/javascript" src="{{ MUMBLE_MEDIA_PREFIX }}js/logviewer.js"></script>
<script type="text/javascript" src="{{ MUMBLE_MEDIA_PREFIX }}js/buttoniframewindow.js"></script>
@ -59,6 +60,12 @@
width: 350,
split: true,
enableDD: true,
plugins: [
new Ext.ux.MumbleUserEditor({
serverid: {{MumbleServer.id}}
}),
new Ext.ux.MumbleChannelEditor()
],
source_url: "{% url mumble.views.cvp_json MumbleServer.id %}",
imageurl: '{{MUMBLE_MEDIA_PREFIX}}/img',
listeners: {

8
pyweb/mumble/views.py

@ -258,6 +258,14 @@ def moveChannel( request, server, channelid, parentid ):
raise Exception( 'Access denied' )
srv.moveChannel( channelid, parentid )
@EXT_DIRECT_PROVIDER.register_method( "Mumble" )
def kickUser( request, server, sessionid, reason, ban, duration ):
srv = get_object_or_404( Mumble, id=int(server) )
if not srv.isUserAdmin( request.user ):
raise Exception( 'Access denied' )
if ban:
srv.banUser( sessionid, reason, duration )
srv.kickUser( sessionid, reason )
@EXT_DIRECT_PROVIDER.register_method( "MumbleUserAdmin" )
def users( request, server ):

Loading…
Cancel
Save