k * векторИзТекущегоПоложения-в-Цель
:x = x + k * (xTarget - x);
y = y + k * (yTarget - y);
from django.conf import settings
from django.core.cache import cache, get_cache
from django.utils.importlib import import_module
class UserRestrictMiddleware(object):
def process_request(self, request):
"""
Checks if different session exists for user and deletes it.
"""
if request.user.is_authenticated():
cache = get_cache('default')
cache_timeout = 86400
cache_key = "user_pk_%s_restrict" % request.user.pk
cache_value = cache.get(cache_key)
if cache_value is not None:
if request.session.session_key != cache_value:
engine = import_module(settings.SESSION_ENGINE)
session = engine.SessionStore(session_key=cache_value)
session.delete()
cache.set(cache_key, request.session.session_key,
cache_timeout)
else:
cache.set(cache_key, request.session.session_key, cache_timeout)
id | name | parent_id
1 | Спорт | null
2 | Футбол | 1
3 | Чемпионат РФПЛ | 2
id | tree_id | data
1 | 3 | Инфа о чемпионате РФПЛ
select * from data where tree_id=3
class MyView(...):
form_class = MyForm
def get_form_kwargs(self, ...): # название метода условно, не уверен, что он так называется в generic views и даже что он есть :)
kwargs = super(MyView, self).get_form_kwargs(...)
kwargs.update({'disabled': not self.request.user.has_perm(...)})
return kwargs
class MyForm(...):
def __init__(self, *args, **kwargs):
is_disabled = kwargs.pop('disabled')
super(MyForm, self).__init__(*args, **kwargs)
if is_disabled:
self.fields['foo'].widget.attrs.update({'disabled': 'disabled'})
>>> import random
>>> ['%.2f' % random.random() for i in range(10)]
['0.21', '0.66', '0.18', '0.48', '0.86', '0.46', '0.48', '0.04', '0.67', '0.37']
>>>
>>> ['%.2f' % random.random() for i in range(10)]
['0.90', '0.68', '0.02', '0.90', '0.63', '0.06', '0.22', '0.14', '0.97', '0.68']
>>>
>>> random.seed(5)
>>> ['%.2f' % random.random() for i in range(10)]
['0.62', '0.74', '0.80', '0.94', '0.74', '0.92', '0.03', '0.47', '0.94', '0.65']
>>>
>>> random.seed(5)
>>> ['%.2f' % random.random() for i in range(10)]
['0.62', '0.74', '0.80', '0.94', '0.74', '0.92', '0.03', '0.47', '0.94', '0.65']
class FloodSafeMixin(object):
def __init__(self, *args, **kwargs):
request = kwargs.pop('request', None)
if request:
self._user = request.user.username if request.user.is_authenticated() else None
self._ip = get_ip(request)
self._period = OrderedDict()
self._period['days'] = kwargs.pop('days', None)
self._period['hours'] = kwargs.pop('hours', None)
self._period['minutes'] = kwargs.pop('minutes', None)
self._period['seconds'] = kwargs.pop('seconds', None)
self._period['milliseconds'] = kwargs.pop('milliseconds', None)
if not any(self._period.values()):
self._period = {'minutes': 1}
else:
self._period = OrderedDict([(k, v) for k, v in self._period.items() if v])
else:
self._ip = None
super(FloodSafeMixin, self).__init__(*args, **kwargs)
def clean(self):
cleaned_data = super(FloodSafeMixin, self).clean()
sender_id = hashlib.md5((self._user if self._user else self._ip).encode('utf-8')).hexdigest()
if sender_id:
class_name = self.__class__.__name__
cache_name = 'last-submit.{0}.{1}'.format(class_name, sender_id)
now = datetime.now()
last_submit = cache.get(cache_name, now - timedelta(days=1))
if (now - last_submit) < timedelta(**self._period):
cache.set(cache_name, now)
period = ' '.join([u'{0} {1}'.format(v, _p('genitive', k)) for k, v in self._period.items()])
raise forms.ValidationError(_('Form submitted less than %(period)s ago'), code='flood',
params={'period': period})
else:
if not self.errors:
cache.set(cache_name, now)
return cleaned_data
class FeedbackForm(FloodSafeMixin, forms.Form):
...
class SomeFormHandlerView(FormView):
def get_form_kwargs(self):
kwargs = super(GenericFormHandlerView, self).get_form_kwargs()
kwargs['request'] = self.request
kwargs['minutes'] = 2
return kwargs
...
Правильно ли я понимаю что для хранение файлов их нужно разбивать по папкам,
допустим на сервер пользователь с Ником username заливает файл file.mp4, и я сохраняю этот файл по пути u/us/use/user/usern/file.mp4 и такой путь формируется для каждого пользователя
28c5a6d8-f7b5-440f-aeaa-150e4fd0bebc
, а его уже сегментировать? Например, два сегмента по два символа датут прикольные ссылки вида 28/c5/28c5a6d8-f7b5-440f-aeaa-150e4fd0bebc
и возможность разместить 65 тысяч файлов так, чтобы они были по одной штуке в директории :)если будет 2 одинаковых названия файла у одного пользователя то просто добавляю к новому файлу номер (file1.mp4)
function first_order_add_fee() {
global $wpdb, $woocommerce;
if ( is_user_logged_in() ) {
$customer_id = get_current_user_id();
$orderNumCheck = wc_get_customer_order_count( $customer_id ); // count orders by current customer
$options = get_option( 'first_order_add_settings' );
$discountType = $options['first_order_choose'];
$discountValue = $options['first_order_add_value'];
$subtotal = WC()->cart->cart_contents_total;
$discount = $discountValue/100;
$check5order = $orderNumCheck + 1;
if ($check5order % 5 == 0) {
$product_id = 1802;
$found = false;
//check if product already in cart
if ( sizeof( WC()->cart->get_cart() ) > 0 ) {
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
$_product = $values['data'];
if ( $_product->id == $product_id )
$found = true;
}
// if product not found, add it
if ( ! $found )
WC()->cart->add_to_cart( $product_id );
} else {
// if no products in cart, add it
WC()->cart->add_to_cart( $product_id );
}
}
WC()->cart->add_fee( 'Скидка 10%', -$subtotal*$discount );
}
}
function add_custom_price( $cart_object ) {
foreach ( $cart_object->cart_contents as $key => $value ) {
if ($value["product_id"] == "1802") {
$currPrice = $value['data']->price;
$currQuant = $value["quantity"];
$totalPrice = $currPrice * $currQuant;
$salePrice = $totalPrice - $currPrice;
$salingPrice = $salePrice/$currQuant;
$value['data']->price = $salingPrice;
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' );
add_action( 'woocommerce_cart_calculate_fees','first_order_add_fee' );