<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Amr shadid </title>
    <description>The latest articles on DEV Community by Amr shadid  (@amrshadid).</description>
    <link>https://dev.to/amrshadid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F551069%2Ff8a31707-aed9-4c2d-90e4-659817ae8888.jpeg</url>
      <title>DEV Community: Amr shadid </title>
      <link>https://dev.to/amrshadid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amrshadid"/>
    <language>en</language>
    <item>
      <title>Django Signals part 1</title>
      <dc:creator>Amr shadid </dc:creator>
      <pubDate>Fri, 30 Sep 2022 13:36:39 +0000</pubDate>
      <link>https://dev.to/amrshadid/django-signals-part-1-32ak</link>
      <guid>https://dev.to/amrshadid/django-signals-part-1-32ak</guid>
      <description>&lt;p&gt;In this article, I will explain what Django built-in signals are. and where are they implemented? And why are they so effective and useful? Let's get started!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Django signal helps decoupled applications get notified when actions occur elsewhere in the framework.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means that the function is notified to be executed when a certain condition is met. For instance when we add a new record to a database, Sometimes we would need to perform the function before or after saving, deleting and so on.&lt;/p&gt;

&lt;p&gt;What can Django Signals do for us? Consider the following scenario: suppose we have a blog platform with many users, and if any user publishes a new article, all other users should be notified by sending a short notification such as "A new article has been added, check it out." &lt;/p&gt;

&lt;p&gt;In this case, we can use Django signal to notify a function that is used to send a notification to all other users once the article has been successfully saved on the database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjqjbabvxzlqs8s4rotw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjqjbabvxzlqs8s4rotw.jpeg" alt="wakeup!"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Django comes with five built-in signals: Model, Management, HTTP requests, Testing, and Database wrappers. Each of those signals is an object from the signal class, which provides a set of functions for signal handling, such as connecting and disconnecting.&lt;/p&gt;

&lt;p&gt;signals have two parameters that are commonly used: sender and receiver. We may specify who will send the signal and where we will receive it. Which function should be run? &lt;/p&gt;

&lt;p&gt;In this part of our Django signals series, we'll look at request/response (HTTP) signals, explain their specifics, and demonstrate how to utilize them easily and correctly.&lt;/p&gt;

&lt;p&gt;Request/response signals are used to work with HTTP requests to do a variety of things such as generate a performance report for the request or perform some operations when the request begins, when it is completed, or when an error occurs.&lt;/p&gt;

&lt;p&gt;request/response signals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;request_started signal&lt;/li&gt;
&lt;li&gt;Request_finished signal&lt;/li&gt;
&lt;li&gt;got_request_exception signal&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To work with signals, the receiver function must have a '**Kwargs' parameter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#request/response signals can import statement 
from django.core.signals import &amp;lt;#Name-Signal#&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;request_started signal&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;import statement:&lt;br&gt;
&lt;code&gt;from django.core.signals import request_started&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When a request is initiated, this signal is used to execute a function. For example, when a request is initiated, start a timer.&lt;/p&gt;

&lt;p&gt;Parameters:&lt;/p&gt;

&lt;p&gt;-1 sender: In the default configuration, the sender of the request_started signal is WSGI.&lt;br&gt;
-2 environ: The environ dictionary provided to the request&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;request_finished signal&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;import statement:&lt;br&gt;
&lt;code&gt;from django.core.signals import request_finished&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This signal is used to executed a function when request is finished. Follow to previous example we want to stop timer when request is finished.&lt;/p&gt;

&lt;p&gt;request_finished have one parameter:&lt;/p&gt;

&lt;p&gt;-1 sender: as above &lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;got_request_exception&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This signal is used for request exceptions. For example, we want to save our failure logs to a text file.&lt;/p&gt;

&lt;p&gt;import statement:&lt;br&gt;
&lt;code&gt;from django.core.signals import got_request_exception&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;request_finished have one parameter:&lt;/p&gt;

&lt;p&gt;-1 sender: Not used (always None)&lt;br&gt;
-2 request: The HTTPRequest object, provided by HTTPRequest class from Django framework,  &lt;/p&gt;




&lt;h2&gt;
  
  
  Code :
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import time 
import logging
from django.core.signals import request_started,\
    request_finished,\
    got_request_exception

def started(sender, **kwargs):
     global started
     started = time.time()

def finished(sender, **kwargs):
    total = time.time() - started
    print ("Timer| %.4fs" % total)

def log(**kwargs):
    logging.exception('error')

request_started.connect(started) 
request_finished.connect(finished) 
got_request_exception.connect.connect(log)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>django</category>
      <category>tutorial</category>
      <category>programming</category>
      <category>api</category>
    </item>
    <item>
      <title>React zoom and pan with draggable elements</title>
      <dc:creator>Amr shadid </dc:creator>
      <pubDate>Mon, 21 Mar 2022 00:04:53 +0000</pubDate>
      <link>https://dev.to/amrshadid/react-zoom-and-pan-with-draggable-elements-4mn8</link>
      <guid>https://dev.to/amrshadid/react-zoom-and-pan-with-draggable-elements-4mn8</guid>
      <description>&lt;p&gt;I just try to build drag-able elements then move them around the screen and zoom it using mouse events, So how we can implement that using React. &lt;/p&gt;

&lt;p&gt;I was searching in npm.io to find a package that can provide those features. Finally, I found some packages that can implement what I want, for that, I want to share the outcome here and highlight how I make integrate these packages with each other.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg41wu324c0mx861qvulz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg41wu324c0mx861qvulz.gif" alt="Sql builder, finally result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first chapter will explain how we can create draggable elements,  is a great existing package called&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/react-draggable/v/4.4.3" rel="noopener noreferrer"&gt;&lt;strong&gt;react-draggable&lt;/strong&gt;&lt;/a&gt;, This package is powerful that can provide draggable elements using JavaScript.&lt;/p&gt;

&lt;p&gt;It's very easy to use and has powerful features. &lt;/p&gt;

&lt;p&gt;The below code snippet explains how we can create drag-able elements. Draggable elements have powerful functions that are called when on-drag start or on end to perform some routine like update state or do something.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import * as React from 'react'
import Draggable from 'react-draggable'

export default function Table(props: ITableProps
                                    &amp;amp; ITableOptionsProps) {

    return (
        &amp;lt;Draggable onDrag={props.onDrag} onStop={props.onStop}&amp;gt;
            &amp;lt;div className='table'&amp;gt;

                &amp;lt;div className='table-name'&amp;gt;
                    &amp;lt;h3&amp;gt;{props.name}&amp;lt;/h3&amp;gt;
                &amp;lt;/div&amp;gt;

                {props.att.map((value,index)=&amp;gt;(

                    &amp;lt;div key={index} className='attribute' id={props.name+"."+value.name}&amp;gt;
                        &amp;lt;div className='element'&amp;gt;&amp;lt;h3&amp;gt;{value.name}&amp;lt;/h3&amp;gt;&amp;lt;/div&amp;gt;
                        &amp;lt;div className='element type'&amp;gt;&amp;lt;h3&amp;gt;{value.type}&amp;lt;/h3&amp;gt;&amp;lt;/div&amp;gt;
                        &amp;lt;div className='element null'&amp;gt;&amp;lt;h3&amp;gt;{value.null}&amp;lt;/h3&amp;gt;&amp;lt;/div&amp;gt;
                        &amp;lt;div className='element pk'&amp;gt;{value.pk?&amp;lt;h3&amp;gt;pk&amp;lt;/h3&amp;gt;:null}&amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                ))}
            &amp;lt;/div&amp;gt;
        &amp;lt;/Draggable&amp;gt;
    );}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;CSS:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

.table{
  position: fixed;
  display: flex;
  flex-direction: column;
  cursor: move;
  align-items: center;
  background-color: transparent;
  min-width: 380px;
  min-height: 200px;
  border: 2px solid #9BA1A6;
  border-radius: 7px;
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;the output of the above code block is div have style class called table &lt;code&gt;&amp;lt;div className='table'&amp;gt;&lt;/code&gt; these table elements can drag around the page using mouse.&lt;/p&gt;

&lt;p&gt;Now the second chapter explains how we can build a transform Wrapper that can provide zoom and pan, of course using the great package called &lt;a href="https://github.com/prc5/react-zoom-pan-pinch" rel="noopener noreferrer"&gt;&lt;strong&gt;react-zoom-pan-pinch&lt;/strong&gt;&lt;/a&gt;, react-zoom-pan-pinch is a powerful package that provides transform wrapper, transform component, and zoom controlling features. &lt;/p&gt;

&lt;p&gt;After we create drag-able elements now we need to contain these elements in the transform wrapper to enable zoom controlling and pan the elements as a group.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import * as React from 'react';
import { AppContext } from '../../context';
import Table from '../table';
import { 
TransformWrapper, 
TransformComponent 
} from "react-zoom-pan-pinch";


export default function Main(props: IMainProps) {
  const context = React.useContext(AppContext)
  const [isMoveable, setIsMoveable] = React.useState&amp;lt;boolean&amp;gt;(false);

  const onDrag = () =&amp;gt; {
    setIsMoveable(true)
    //etc
  }
  const onStop = () =&amp;gt; {
    setIsMoveable(false)
    //etc 

  }


  return (
    &amp;lt;&amp;gt;
      &amp;lt;TransformWrapper
        initialScale={1}
        disabled={isMoveable}
        minScale={.5}
        maxScale={1}
        limitToBounds={false}
        onPanning={updateXarrow}
        onZoom={updateXarrow}
        pinch={{ step: 5 }}
      &amp;gt;

        &amp;lt;TransformComponent 
          contentClass='main' 
          wrapperStyle={{ height: '100vh', width: '80vw' }}&amp;gt;


          {context?.database.schema.map((value, index) =&amp;gt; (
            &amp;lt;Table 
              key={index} 
              name={value.name} 
              att={value.att} 
              onDrag={onDrag} 
              onStop={onStop}/&amp;gt;
          ))}

        &amp;lt;/TransformComponent&amp;gt;
      &amp;lt;/TransformWrapper&amp;gt;

    &amp;lt;/&amp;gt;
  );
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;CSS for content on transform component:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

.main{
  display: flex;
  flex-direction: row;
  position: absolute;
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;we passed two functions to draggable element the first one is &lt;strong&gt;onDrag&lt;/strong&gt; this function will perform when the user start drag element and the last one &lt;strong&gt;onStop&lt;/strong&gt; is will perform when the user finished dragging element, The main ideas of using this function:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;provide enable control for transform wrapper to fix a conflict between draggable elements and transform wrapper.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;perform some updater functions like when we have an arrow between two draggable elements and we move one then we need to update arrow positions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we have draggable elements and transform wrapper, you can visit &lt;a href="https://github.com/amrshadid/sqlbuilder-tool" rel="noopener noreferrer"&gt;sql builder tool&lt;/a&gt; on Github to get a full example with source code.&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>programming</category>
      <category>css</category>
    </item>
  </channel>
</rss>
