1
0
Fork 0
mirror of https://github.com/fastogt/fastocloud_admin.git synced 2025-03-09 23:38:52 +00:00
This commit is contained in:
topilski 2019-06-01 10:36:45 -04:00
parent 3805db5aff
commit 6c378f86aa
9 changed files with 143 additions and 50 deletions

View file

@ -1,5 +1,5 @@
PUBLIC_CONFIG = {'site': {'title': 'FastoCloud', 'keywords': 'video,cloud,iptv,service,server'},
PUBLIC_CONFIG = {'site': {'title': 'FastoCloud', 'keywords': 'video,cloud,iptv,service,restreamer'},
'company': {'title': 'FastoGT', 'domain': 'https://fastogt.com'},
'support': {'contact_email': 'support@fastogt.com',
'contact_address': 'Republic of Belarus, Minsk, Stadionnay str. 5'},
'project': {'version': '1.0.0', 'version_type': 'release'}}
'project': {'version': '1.1.0', 'version_type': 'rc'}}

View file

@ -184,3 +184,14 @@ class Roles(IntEnum):
WRITE = 1
ADMIN = 2
SUPPORT = 3
@classmethod
def choices(cls):
return [(choice, choice.name) for choice in cls]
@classmethod
def coerce(cls, item):
return cls(int(item)) if not isinstance(item, cls) else item
def __str__(self):
return str(self.value)

View file

@ -1,11 +1,11 @@
from flask_wtf import FlaskForm
from flask_babel import lazy_gettext
from wtforms.fields import StringField, SubmitField, FileField, SelectField, FormField
from wtforms.validators import InputRequired, Length
from wtforms.validators import InputRequired, Length, Email
from app.common_forms import HostAndPortForm
from app.service.service_entry import ServiceSettings
from app.constants import StreamType
import app.constants as constants
class ServiceSettingsForm(FlaskForm):
@ -51,11 +51,24 @@ class ActivateForm(FlaskForm):
class UploadM3uForm(FlaskForm):
AVAILABLE_STREAM_TYPES_FOR_UPLOAD = [(StreamType.RELAY, 'Relay'), (StreamType.ENCODE, 'Encode'),
(StreamType.CATCHUP, 'Catchup'), (StreamType.TEST_LIFE, 'Test life'),
(StreamType.VOD_RELAY, 'Vod relay'), (StreamType.VOD_ENCODE, 'Vod encode')]
AVAILABLE_STREAM_TYPES_FOR_UPLOAD = [(constants.StreamType.RELAY, 'Relay'), (constants.StreamType.ENCODE, 'Encode'),
(constants.StreamType.CATCHUP, 'Catchup'),
(constants.StreamType.TEST_LIFE, 'Test life'),
(constants.StreamType.VOD_RELAY, 'Vod relay'),
(constants.StreamType.VOD_ENCODE, 'Vod encode')]
file = FileField()
type = SelectField(lazy_gettext(u'Type:'), coerce=StreamType.coerce, validators=[InputRequired()],
type = SelectField(lazy_gettext(u'Type:'), coerce=constants.StreamType.coerce, validators=[InputRequired()],
choices=AVAILABLE_STREAM_TYPES_FOR_UPLOAD)
submit = SubmitField(lazy_gettext(u'Upload'))
class UserAddForm(FlaskForm):
AVAILABLE_ROLES = [(constants.Roles.READ, 'Read'), (constants.Roles.WRITE, 'Write'),
(constants.Roles.ADMIN, 'Admin'), (constants.Roles.SUPPORT, 'Support')]
email = StringField(lazy_gettext(u'Email:'),
validators=[InputRequired(), Email(message=lazy_gettext(u'Invalid email')), Length(max=30)])
role = SelectField(lazy_gettext(u'Role:'), coerce=constants.Roles.coerce, validators=[InputRequired()],
choices=AVAILABLE_ROLES)
apply = SubmitField(lazy_gettext(u'Apply'))

View file

@ -38,3 +38,7 @@ class ServiceSettings(Document, ServerSettings):
out.uri)
return result
def add_user(self, user: UserPair):
self.users.append(user)
self.save()

View file

@ -1,15 +1,14 @@
import os
from bson.objectid import ObjectId
from flask_classy import FlaskView, route
from flask import render_template, redirect, url_for, request, jsonify
from flask_login import login_required, current_user
from app import get_runtime_folder
from app.service.forms import ServiceSettingsForm, ActivateForm, UploadM3uForm
from app.service.forms import ServiceSettingsForm, ActivateForm, UploadM3uForm, UserAddForm
from app.service.service_entry import ServiceSettings, UserPair
from app.utils.m3u_parser import M3uParser
from app.home.user_loging_manager import User
import app.constants as constants
@ -141,6 +140,20 @@ class ServiceView(FlaskView):
# broadcast routes
@login_required
@route('/user/add/<sid>', methods=['GET', 'POST'])
def user_add(self, sid):
form = UserAddForm()
if request.method == 'POST' and form.validate_on_submit():
user = User.objects(email=form.email.data).first()
server = ServiceSettings.objects(id=sid).first()
if server and user:
admin = UserPair(user.id, form.role.data)
server.add_user(admin)
return jsonify(status='ok'), 200
return render_template('service/user/add.html', form=form)
@login_required
@route('/add', methods=['GET', 'POST'])
def add(self):
@ -148,12 +161,12 @@ class ServiceView(FlaskView):
form = ServiceSettingsForm(obj=model)
if request.method == 'POST' and form.validate_on_submit():
new_entry = form.make_entry()
new_entry.users.append(UserPair(current_user.id, constants.Roles.ADMIN))
new_entry.save()
admin = UserPair(current_user.id, constants.Roles.ADMIN)
new_entry.add_user(admin)
current_user.add_server(new_entry)
return jsonify(status='ok'), 200
return render_template('service/add.html', form=form)
return render_template('service/user/add.html', form=form)
@login_required
@route('/remove', methods=['POST'])
@ -179,24 +192,6 @@ class ServiceView(FlaskView):
return render_template('service/edit.html', form=form)
@login_required
@route('/find_and_add', methods=['POST'])
def find_and_add(self):
sid = request.form['sid']
if ObjectId.is_valid(sid):
server = ServiceSettings.objects(id=sid).first()
if server:
for user in server.users:
if user.id == current_user.id:
return jsonify(status='failed'), 404
server.users.append(current_user.id)
server.save()
current_user.add_server(server)
return jsonify(status='ok'), 200
return jsonify(status='failed'), 404
@route('/log/<sid>', methods=['POST'])
def log(self, sid):
# len = request.headers['content-length']

View file

@ -0,0 +1,4 @@
{% extends 'service/user/base.html' %}
{% block title %}
Add user to server
{% endblock %}

View file

@ -0,0 +1,43 @@
{% from 'bootstrap/wtf.html' import form_field %}
{% macro render_bootstrap_field(field) %}
<div class="row">
<label class="col-md-4">{{ field.label }}</label>
<div class="col-md-8">
{{ field(class='form-control')|safe }}
</div>
</div>
{% endmacro %}
{% macro render_bootstrap_form(form) %}
<div class="row">
<label class="col-md-4">{{ form.label }}</label>
<div class="col-md-8">
{{ form() }}
</div>
</div>
{% endmacro %}
<form id="user_entry_form" name="user_entry_form" class="form" method="post">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title">
{% block title %}
{% endblock %}
</h4>
</div>
<div class="modal-body">
{{ form.hidden_tag() }}
<br>
{{ render_bootstrap_field(form.email) }}
<br>
{{ render_bootstrap_form(form.role) }}
</div>
<div class="modal-footer">
{% block footer %}
<button type="button" class="btn btn-danger" data-dismiss="modal">{% trans %}Cancel{% endtrans %}</button>
{{ form_field(form.apply, class="btn btn-success") }}
{% endblock %}
</div>
</form>

View file

@ -0,0 +1,4 @@
{% extends 'service/base.html' %}
{% block title %}
Edit service
{% endblock %}

View file

@ -60,9 +60,13 @@ Settings | {{ config['PUBLIC_CONFIG'].site.title }}
<td>{{ loop.index }}</td>
<td>{{ server.name }}</td>
<td>
<button type="submit" class="btn btn-danger btn-xs" onclick="edit_server('{{ server.id }}')">
<button type="submit" class="btn btn-success btn-xs" onclick="edit_server('{{ server.id }}')">
{% trans %}Edit{% endtrans %}
</button>
<button type="submit" class="btn btn-success btn-xs"
onclick="add_user_to_server('{{ server.id }}')">
{% trans %}Add user{% endtrans %}
</button>
<button type="submit" class="btn btn-danger btn-xs" onclick="remove_server('{{ server.id }}')">
{% trans %}Remove{% endtrans %}
</button>
@ -80,21 +84,6 @@ Settings | {{ config['PUBLIC_CONFIG'].site.title }}
</button>
</div>
</div>
</br>
<div class="row well">
<h3>Find and add server by ID:</h3>
<form class="form-group row" action="{{ url_for('ServiceView:find_and_add') }}" method="post">
<div class="col-md-10">
<div class="form-group">
<input class="form-control" name="sid" minlength="24" maxlength="24"
placeholder="ID (24-character hex string)">
</div>
</div>
<div class="col-md-2">
<button type="submit" class="btn btn-success">Find and Add</button>
</div>
</form>
</div>
</div>
<div id="service_dialog" class="modal fade" tabindex=-1 role="dialog">
<div class="modal-dialog" role="document">
@ -126,6 +115,38 @@ Settings | {{ config['PUBLIC_CONFIG'].site.title }}
});
}
function add_user_to_server_entry(url) {
$.ajax({
url: url,
type: "POST",
dataType: 'json',
data: $('#user_entry_form').serialize(),
success: function (response) {
console.log(response);
$('#service_dialog').modal('hide');
window.location.reload();
},
error: function (error) {
console.error(error);
$('#service_dialog .modal-content').html(data);
}
});
}
function add_user_to_server(sid) {
var url = "/service/user/add/" + sid;
$.get(url, function(data) {
$('#service_dialog .modal-content').html(data);
$('#service_dialog').modal();
$('#apply').click(function(event) {
event.preventDefault();
add_user_to_server_entry(url);
})
});
}
function add_server() {
var url = "{{ url_for('ServiceView:add') }}";
$.get(url, function(data) {
@ -185,7 +206,5 @@ Settings | {{ config['PUBLIC_CONFIG'].site.title }}
}
});
}
</script>
{% endblock %}